Announcement

Collapse
No announcement yet.

Den erste und den Letzten in einer "NullerReihe" finden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Den erste und den Letzten in einer "NullerReihe" finden

    Hallo,

    ich kämpfe schon länger nun mit dem Problem das ich Datensätze wie folgt selektieren will.

    Ich muss die Daten mit dem Wert 0 finden aber nur die vom 14.12.2011 weil es der Höchste der "Nullerreihe" ist und den 16.12.2011 weil es der niedrigste Datumswert der Nullerreihe ist.
    Die Datensätze dazwischen benötige ich nicht.
    Den 18.12.2011 benötige ich auch weil danach und davor ein Wert folgt.

    TestwertT
    Name, value, Datum
    Hans, 123, 12.12.2011
    Hans, 123, 13.12.2011
    Hans, 0, 14.12.2011
    Hans, 0, 15.12.2011
    Hans, 0, 16.12.2011
    Hans, 124, 17.12.2011
    Hans, 0, 18.12.2011
    Franz, 123, 12.12.2011
    Franz, 123, 13.12.2011
    Franz, 0, 14.12.2011
    Franz, 0, 15.12.2011
    Franz, 0, 16.12.2011
    Franz, 124, 17.12.2011
    Franz, 0, 18.12.2011

    Ich verbringe nun schon mit dem Problem Tage.

    Mein ansatz war:
    SELECT A.[Name], A.[value], A.[Datum]
    FROM TestwertT AS A
    WHERE A.[Datum] = (SELECT MAX(B.[Datum]) FROM TestwertT AS B WHERE B.[Name]= A.[Name]);

    Aber das dauer wirklich lange und Funktioniert nicht richtig.

    Hoffe mir kann wer Helfen.
    Vielen Dank
    Sonic
    Zuletzt editiert von Javasonic; 30.03.2011, 21:56.

  • #2
    Warum jetzt der 16. und nicht der 18. genommen wird geht für mich aus deiner Erklärung nicht hervor. Und wie und was nach dem 18. folgt kann ich auch nicht erkennen. Das ist mir zu ungenau spezifiziert, daher kann ich dir hier leider nicht helfen.

    bye,
    Helmut

    Comment


    • #3
      Es sollen alle Werte die grün markiert sind selektiert werden.
      Egal ob von Hans oder Franz.
      Nur die Datensätze mit 0 zwischen dem Ersten und dem Letzten sollen nicht dabei sein!

      Es können auch mehrer query.

      Eine Idee vom mir wäre.

      Select A.[Name], A.[value],MAX(A.[Datum])
      from TestwertT AS A
      Where A.[value]=0
      group by A.[Name], A.[value], A.[Datum]

      UNION

      Select A.[Name], A.[value],MIN(A.[Datum])
      from TestwertT AS A
      Where A.[value]=0
      group by A.[Name], A.[value], A.[Datum]


      Ergebnis MAX
      Hans, 0, 18.12.2011
      Franz, 0, 18.12.2011

      Ergebnis MIN
      Hans, 0, 14.12.2011
      Franz, 0, 14.12.2011

      Jetzt Fehlen mir aber noch
      Hans, 0, 16.12.2011
      Franz, 0, 15.12.2011

      gibt es eine Möglichkeit wie ich die auch noch bekomme?

      Wäre um jede Idee sehr Dankbar.
      Sonic
      Zuletzt editiert von Javasonic; 30.03.2011, 22:11.

      Comment


      • #4
        Hallo,
        Originally posted by Javasonic View Post
        ...Ich muss die Daten mit dem Wert 0 finden aber nur die vom 14.12.2011 weil es der Höchste der "Nullerreihe" ist und den 16.12.2011 weil es der niedrigste Datumswert der Nullerreihe ist.
        Die Datensätze dazwischen benötige ich nicht.
        Den 18.12.2011 benötige ich auch weil danach und davor ein Wert folgt.
        Also um es erstmal klarzustellen, ein DAVOR, DANACH oder DAZWISCHEN gibt es in SQL NICHT! Du kannst keine Bedingung an irgendwas "vor" oder "nach" einem Datensatz festmachen. Eine Reihenfolge entsteht in SQL erst bei der Ausgabe durch die ORDER BY Klausel.
        Versuche also dein gewünschtes Ergebnis als Menge zu beschreiben, ohne davor, danach und dazwischen zu verwenden.

        Im Übrigen ist mir auch nicht ganz klar wieso der 14.12.2011 der "Höchste" und der 16.12.2011 der "niedrigste" Datumswert sein soll. Nach meinem Verständnis kommt der 16. immer noch NACH dem 14. und ist damit grösser, also höher.

        Und bitte beachten: Formatierung von SQL in Beiträgen

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Neuer Versuch

          Erst mal sorry für mein dilettantisches verhalten.

          @Falk Prüfer
          Leider stehe ich bei sql ganz am Anfang wie man merkt.
          du hast recht!

          Ergebnis MAX
          Hans, 0, 14.12.2011
          Franz, 0, 14.12.2011

          den 16.12.2011 hätte ich gerne.

          Bei der Abfrage wird nach ORDER BY Datum sortiert.

          ich hätte gerne den ersten Datensatz nach
          Hans, 123, 13.12.2011

          und den ersten vor
          Hans, 124, 17.12.2011

          den Datensatz vor
          Franz, 123, 12.12.2011

          Hilft das?

          Comment


          • #6
            Originally posted by Javasonic View Post
            ...ich hätte gerne den ersten Datensatz nach
            Hans, 123, 13.12.2011

            und den ersten vor
            Hans, 124, 17.12.2011

            den Datensatz vor
            Franz, 123, 12.12.2011
            Schon wieder "vor" und "nach" dabei...

            Aber um ganz ehrlich zu sein: Das was du hier versuchst, wird sich gaaanz schwer in SQL beschreiben lassen, zumindest nicht ohne mehrfach verschachtelte Subqueries!

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Noch ein Versuch

              Hallo,

              kann ich irgend wo was dazu nachlesen?
              Oder mit einem Curser in einer Prozedur lösen?

              Danke
              Sonic
              Zuletzt editiert von Javasonic; 31.03.2011, 14:37.

              Comment


              • #8
                Ich würde mal sagen, deine Frage versteht hier immer noch keiner.
                Warum zB. sind Datensätze mit einem value ungleich 0 dabei? Spielen die irgendwie eine Rolle? Wenn nicht, dann lasse sie bitte gleich mal weg, denn dass man die mit where value = 0 ganz einfach herausfiltern kann ist eh klar.

                Also konkret, wären die Daten genau so:

                Hans, 12.12.2011
                Franz, 11.12.2011
                Franz, 14.12.2011
                Franz, 15.12.2011
                Hans, 16.12.2011
                Franz, 18.12.2011

                ... wie müsste dann das richtige Ergebnis aussehen?

                bye,
                Helmut

                Comment


                • #9
                  Na er will praktisch erst alle datensätze auf 0 filtern, dann nach datum sortieren und davon den ersten und den letzten. So häts ich zumindest verstanden.

                  Comment


                  • #10
                    Hallo

                    da ich auch nicht genau weiss, was Du wünscht, aber trotzedem

                    [highlight=sql]
                    WITH Tabelle1 AS
                    (
                    SELECT 'Hans'Name,'123' value, '12.12.2011' Datum FROM dual UNION ALL
                    SELECT 'Hans', '123', '13.12.2011' FROM dual UNION ALL
                    SELECT 'Hans', '0', '14.12.2011' FROM dual UNION ALL
                    SELECT 'Hans', '0', '15.12.2011' FROM dual UNION ALL
                    SELECT 'Hans', '0', '16.12.2011' FROM dual UNION ALL
                    SELECT 'Hans', '124', '17.12.2011' FROM dual UNION ALL
                    SELECT 'Hans', '0', '18.12.2011' FROM dual UNION ALL
                    SELECT 'Franz','123', '12.12.2011' FROM dual UNION ALL
                    SELECT 'Franz', '123', '13.12.2011' FROM dual UNION ALL
                    SELECT 'Franz', '0', '14.12.2011' FROM dual UNION ALL
                    SELECT 'Franz', '0', '15.12.2011' FROM dual UNION ALL
                    SELECT 'Franz', '0', '16.12.2011' FROM dual UNION ALL
                    SELECT 'Franz', '124', '17.12.2011' FROM dual UNION ALL
                    SELECT 'Franz', '0', '18.12.2011' FROM dual)
                    select distinct a.name,a.value,a.datum from
                    (select tabelle1.*,ROW_NUMBER() OVER(PARTITION BY value,name ORDER BY Datum) nummer
                    from tabelle1 order by name,datum,value)a
                    join
                    (select tabelle1.*,ROW_NUMBER() OVER(PARTITION BY value,name ORDER BY Datum) nummer
                    from tabelle1 )b
                    on a.name=b.name
                    where abs(a.nummer-b.nummer)=1
                    and a.value=0
                    order by a.name,a.datum,a.value;
                    [/highlight]

                    Das wären dann

                    Franz 0 14.12.2011
                    Franz 0 15.12.2011
                    Franz 0 16.12.2011
                    Franz 0 18.12.2011
                    Hans 0 14.12.2011
                    Hans 0 15.12.2011
                    Hans 0 16.12.2011
                    Hans 0 18.12.2011

                    die.

                    Gruß

                    Martin

                    Comment


                    • #11
                      Sorry noch mal ich Versuche es noch mal anders

                      Hallo,

                      ich glaube ich erzähle nun mal meine ganze Geschichte.

                      Ich bin eigentlich Sysadmin und kein entwickler wie ihr schon gemerkt habt.

                      Ich habe die Frage so gestellt weil ich mir dachte es ist einfacher sich nur um die Nullerblöcke zu kümmern.

                      Bei meinen Überwachungsprogramm werden von jedem Tag ein Wert aufgzeichnet.
                      Wenn nun Server down sind bekomme ich eine 0 Wert.
                      Hans ist z.B ein Server

                      Für weitere Auswertungen will ich mir die ganzen Nullwerte sparen damit ich keinen Datenfriedhof bekomme.

                      Ich benötige eigentlich die roten markierten Daten nicht. Weil meine Auswertungen immer auf den letzten Tag gehn und es mir egal ist wenn ich ein halbes Jahr mit 0 Werten habe.

                      Hans, 123, 12.12.2011
                      Hans, 123, 13.12.2011
                      Hans, 0, 14.12.2011
                      Hans, 0, 15.12.2011
                      Hans, 0, 16.12.2011
                      Hans, 124, 17.12.2011
                      Hans, 0, 18.12.2011
                      Franz, 123, 12.12.2011
                      Franz, 123, 13.12.2011
                      Franz, 0, 14.12.2011
                      Franz, 0, 15.12.2011
                      Franz, 0, 16.12.2011
                      Franz, 124, 17.12.2011
                      Franz, 0, 18.12.2011
                      Sepp,0, 01.12.2011
                      Sepp,0,02.12.2011
                      Sepp,0,03.12.2011
                      Sepp,0,04.12.2011

                      Sepp,0,05.12.2011

                      Vielen vielen Dank für die Bemühungen!
                      Sonic

                      Comment


                      • #12
                        Ist das wieder Unklar?

                        Hallo,

                        hab ich mich diesmal wieder unklar ausgedrückt?
                        Kann ich das vielleicht mit einer Prozedur lösen?

                        Ich komme irgendwie nicht weiter.

                        Danke
                        mfg
                        Sonic

                        Comment


                        • #13
                          Willst du jetzt aber alle Daten sehen, die NICHT rot sind, auch wenn value nicht 0 ist?? Und kann man davon ausgehen, dass es je Server und je Tag immer genau einen Eintrag gibt?

                          bye,
                          Helmut

                          Comment


                          • #14
                            Originally posted by hwoess View Post
                            Willst du jetzt aber alle Daten sehen, die NICHT rot sind, auch wenn value nicht 0 ist?? Und kann man davon ausgehen, dass es je Server und je Tag immer genau einen Eintrag gibt?

                            bye,
                            Helmut
                            Hallo Helmut,

                            ja ich will alle value sehn, die nicht rot sind. Der value der rot markierten Datensätze , die ich nicht sehen will, ist immer Null.

                            Ja ein Server macht an einem Tag nur einen Eintrag.

                            1,Hans, 123, 12.12.2011
                            2,Hans, 123, 13.12.2011
                            3,Hans, 0, 14.12.2011
                            4,Hans, 0, 15.12.2011
                            5,Hans, 0, 16.12.2011
                            6,Hans, 124, 17.12.2011
                            7,Hans, 0, 18.12.2011
                            8,Franz, 123, 12.12.2011
                            9,Franz, 123, 13.12.2011
                            10,Franz, 0, 14.12.2011
                            11,Franz, 0, 15.12.2011
                            12,Franz, 0, 16.12.2011
                            13,Franz, 124, 17.12.2011
                            14,Franz, 0, 18.12.2011
                            15,Sepp, 0, 01.12.2011
                            16,Sepp, 0, 02.12.2011
                            17,Sepp, 0, 03.12.2011
                            18,Sepp, 0, 04.12.2011
                            19,Sepp, 0, 05.12.2011


                            So schaut die richtige Lösung aus:
                            1,Hans, 123, 12.12.2011
                            2,Hans, 123, 13.12.2011
                            3,Hans, 0, 14.12.2011
                            5,Hans, 0, 16.12.2011
                            6,Hans, 124, 17.12.2011
                            7,Hans, 0, 18.12.2011
                            8,Franz, 123, 12.12.2011
                            9,Franz, 123, 13.12.2011
                            10,Franz, 0, 14.12.2011
                            12,Franz, 0, 16.12.2011
                            13,Franz, 124, 17.12.2011
                            14,Franz, 0, 18.12.2011
                            15,Sepp, 0, 01.12.2011
                            19,Sepp, 0, 05.12.2011

                            Ich bin fast schon am Verzweifeln. Ich werde mich dieser Wochenene noch ein mal dahinter klemen und versuchen eine Lösung zu finden.

                            Vielleicht kann ich das Problem mit einer Prozedur lösen?

                            Bin für jeden Tipp der helfen könnte Dankbar.

                            Schönes Wochenender
                            Sonic

                            Comment


                            • #15
                              Null Problemo, unter MS-SQL 2008 geht das so:
                              [Highlight="SQL"]
                              WITH Data ( ID, Name, Nr, Datum
                              ) AS
                              ( SELECT 1,'Hans', 123, CONVERT (DATETIME, '12.12.2011', 104) UNION ALL
                              SELECT 2,'Hans', 123, CONVERT (DATETIME, '13.12.2011', 104) UNION ALL
                              SELECT 3,'Hans', 0, CONVERT (DATETIME, '14.12.2011', 104) UNION ALL
                              SELECT 4,'Hans', 0, CONVERT (DATETIME, '15.12.2011', 104) UNION ALL
                              SELECT 5,'Hans', 0, CONVERT (DATETIME, '16.12.2011', 104) UNION ALL
                              SELECT 6,'Hans', 124, CONVERT (DATETIME, '17.12.2011', 104) UNION ALL
                              SELECT 7,'Hans', 0, CONVERT (DATETIME, '18.12.2011', 104) UNION ALL
                              SELECT 8,'Franz', 123, CONVERT (DATETIME, '12.12.2011', 104) UNION ALL
                              SELECT 9,'Franz', 123, CONVERT (DATETIME, '13.12.2011', 104) UNION ALL
                              SELECT 10,'Franz', 0, CONVERT (DATETIME, '14.12.2011', 104) UNION ALL
                              SELECT 11,'Franz', 0, CONVERT (DATETIME, '15.12.2011', 104) UNION ALL
                              SELECT 12,'Franz', 0, CONVERT (DATETIME, '16.12.2011', 104) UNION ALL
                              SELECT 13,'Franz', 124, CONVERT (DATETIME, '17.12.2011', 104) UNION ALL
                              SELECT 14,'Franz', 0, CONVERT (DATETIME, '18.12.2011', 104) UNION ALL
                              SELECT 15,'Sepp', 0, CONVERT (DATETIME, '01.12.2011', 104) UNION ALL
                              SELECT 16,'Sepp', 0, CONVERT (DATETIME, '02.12.2011', 104) UNION ALL
                              SELECT 17,'Sepp', 0, CONVERT (DATETIME, '03.12.2011', 104) UNION ALL
                              SELECT 18,'Sepp', 0, CONVERT (DATETIME, '04.12.2011', 104) UNION ALL
                              SELECT 19,'Sepp', 0, CONVERT (DATETIME, '05.12.2011', 104)
                              )
                              , Ordered AS
                              ( SELECT ROW_Number () OVER (PARTITION BY Name Order BY Name, Datum) AS Row
                              , ID
                              , Name
                              , Nr
                              , Datum
                              FROM Data
                              )
                              , Nulls1 AS
                              ( SELECT DISTINCT O1.ID
                              FROM Ordered AS O1
                              JOIN Ordered AS O2 ON O1.Name = O2.Name
                              AND O1.Row = O2.Row + 1
                              AND O1.Nr = 0
                              AND O2.Nr = 0
                              )
                              , Nulls2 AS
                              ( SELECT DISTINCT O1.ID
                              FROM Ordered AS O1
                              JOIN Ordered AS O2 ON O1.Name = O2.Name
                              AND O1.Row = O2.Row - 1
                              AND O1.Nr = 0
                              AND O2.Nr = 0
                              )
                              SELECT ID
                              , Name
                              , Nr
                              , Datum
                              FROM Data
                              WHERE ID NOT IN ( SELECT ID
                              FROM Nulls1
                              INTERSECT
                              SELECT ID
                              FROM Nulls2
                              ) [/Highlight]


                              [HIGHLIGHT="Ergebnis"] ID Name Nr Datum
                              ----------- ----- ----------- -----------------------
                              1 Hans 123 2011-12-12 00:00:00.000
                              2 Hans 123 2011-12-13 00:00:00.000
                              3 Hans 0 2011-12-14 00:00:00.000
                              5 Hans 0 2011-12-16 00:00:00.000
                              6 Hans 124 2011-12-17 00:00:00.000
                              7 Hans 0 2011-12-18 00:00:00.000
                              8 Franz 123 2011-12-12 00:00:00.000
                              9 Franz 123 2011-12-13 00:00:00.000
                              10 Franz 0 2011-12-14 00:00:00.000
                              12 Franz 0 2011-12-16 00:00:00.000
                              13 Franz 124 2011-12-17 00:00:00.000
                              14 Franz 0 2011-12-18 00:00:00.000
                              15 Sepp 0 2011-12-01 00:00:00.000
                              19 Sepp 0 2011-12-05 00:00:00.000[/HIGHLIGHT]

                              Andere RDBMS unterstützen ROW_NUMBER () OVER (...) möglicherweise nicht.
                              INTERSECT könnte bei anderen RDBMS auch problematisch sein

                              Comment

                              Working...
                              X