Ergebnis 1 bis 8 von 8

Thema: Ergebniszeilen überspringen

  1. #1
    Nioc ist offline Neuer Benutzer
    Registriert seit
    25.08.2010
    Beiträge
    2

    Standard Ergebniszeilen überspringen

    Hallo liebe Gemeinde,

    ich habe folgendes Problem:
    Ich habe eine Tabelle mit einer Reihe von Messwerten, die alle mit einem Zeitstempel versehen sind. Diese Daten möchte ich in einem Diagramm darstellen. Wenn ich nun den darzustellenden Zeitraum sehr groß wähle macht es keinen Sinn, alle Werte darzustellen, da die Datenmenge sehr groß wird.
    Mein Problem ist nun, die SQL abfrage so zu formulieren, dass ich nur jeden xten wert aus der Datenbank bekommen, sodass der Zeitstempel des folgende Datensatz beispielsweise mindestens 3 sekunden größer ist als der des aktuellen.
    ein Beispiel:

    meine Tabelle hat folgenden Inhalt:

    timestamp Wert
    2010-07-01 15:00:00 2,3
    2010-07-01 15:00:01 2,5
    2010-07-01 15:00:02 2,9
    2010-07-01 15:00:03 2,5
    2010-07-01 15:00:04 2,4
    2010-07-01 15:00:05 2,3
    2010-07-01 15:00:06 2,2
    2010-07-01 15:00:07 2,2
    2010-07-01 15:00:08 2,1
    2010-07-01 15:00:09 2,1
    2010-07-01 15:00:10 2,0

    das ergebnis soll so aussehen:

    2010-07-01 15:00:00 2,3
    2010-07-01 15:00:03 2,5
    2010-07-01 15:00:06 2,2
    2010-07-01 15:00:09 2,1

    Hat jemand eine Idee?
    Ich stehe gerade ein bisschen auf dem Schlach.

    Vielen Dank im Vorraus,
    Robert

  2. #2
    castorp ist offline Erfahrener Benutzer
    Registriert seit
    27.06.2009
    Beiträge
    493

    Standard

    Code:
    SELECT timestamp, wert
    FROM (
      SELECT timestamp, wert, timestamp - lag(timestamp) over (order by timestamp) as diff
      FROM the_table_with_no_name
    ) t
    wHERE diff > interval '3' second
    A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

  3. #3
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von castorp Beitrag anzeigen
    Code:
    SELECT timestamp, wert
    FROM (
      SELECT timestamp, wert, timestamp - lag(timestamp) over (order by timestamp) as diff
      FROM the_table_with_no_name
    ) t
    wHERE diff > interval '3' second
    Yeah, Du warst schneller ;-)

    CTE sind was feines, gell?

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  4. #4
    castorp ist offline Erfahrener Benutzer
    Registriert seit
    27.06.2009
    Beiträge
    493

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    CTE sind was feines, gell?
    Auf jeden Fall, nur dass ich da gar keine CTE sondern eine Windowing Function verwendet habe
    (SCNR)
    A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

  5. #5
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von castorp Beitrag anzeigen
    Auf jeden Fall, nur dass ich da gar keine CTE sondern eine Windowing Function verwendet habe
    (SCNR)
    Ist (für mich) dasselbe ;-)

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  6. #6
    castorp ist offline Erfahrener Benutzer
    Registriert seit
    27.06.2009
    Beiträge
    493

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    Ist (für mich) dasselbe ;-)
    Hmm, das sind zwei vollkommen unterschiedliche Konzepte.
    CTE faktoriert letztendlich sub-queries aus dem Statement heraus, so dass die Teilergebnisse (mehrfach) wiederverwendbar sind (also im Grunde ein view "on-the-fly".

    Windowing functions erlauben eine Gruppierung von Daten innerhalb eines nicht (oder anders) gruppierten Result-Sets bei gleichzeitigen Zugriff auf beliebige Teile der einzelnen Gruppen.

    Das ist schon etwas anderes (und beides ist vollständig unabhängig von dem anderen verwendbar)
    A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

  7. #7
    Nioc ist offline Neuer Benutzer
    Registriert seit
    25.08.2010
    Beiträge
    2

    Standard

    Jo, danke für die super schnelle Antwort!
    Nachdem ich jetzt auch auf PostgreSQL 8.4 umgestiegen bin , konnte ich den Query mal nachvollziehen.
    Er macht zwar das, was er soll, aber nicht das was ich meinte
    Er sucht _aufeinanderfolgende_ Zeilen, die einen Abstand von hier mindestens 3 sekunden haben.
    Allerdings haben die Zeilen in der Tabelle alle einen fixen Abstand. Es sollen bei der Ausgabe des Ergebnisses so lange Zeilen ausgelassen werden, bis eine Zeile erreicht ist, deren Zeitstempel 3 Sekunden großer ist, als der der zuletzt ausgegebenen.

    Hm, ist das verständlich??

  8. #8
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von Nioc Beitrag anzeigen
    Hallo liebe Gemeinde,

    ich habe folgendes Problem:
    Ich habe eine Tabelle mit einer Reihe von Messwerten, die alle mit einem Zeitstempel versehen sind. Diese Daten möchte ich in einem Diagramm darstellen. Wenn ich nun den darzustellenden Zeitraum sehr groß wähle macht es keinen Sinn, alle Werte darzustellen, da die Datenmenge sehr groß wird.
    Mein Problem ist nun, die SQL abfrage so zu formulieren, dass ich nur jeden xten wert aus der Datenbank bekommen, sodass der Zeitstempel des folgende Datensatz beispielsweise mindestens 3 sekunden größer ist als der des aktuellen.
    ein Beispiel:

    meine Tabelle hat folgenden Inhalt:

    timestamp Wert
    2010-07-01 15:00:00 2,3
    2010-07-01 15:00:01 2,5
    2010-07-01 15:00:02 2,9
    2010-07-01 15:00:03 2,5
    2010-07-01 15:00:04 2,4
    2010-07-01 15:00:05 2,3
    2010-07-01 15:00:06 2,2
    2010-07-01 15:00:07 2,2
    2010-07-01 15:00:08 2,1
    2010-07-01 15:00:09 2,1
    2010-07-01 15:00:10 2,0

    das ergebnis soll so aussehen:

    2010-07-01 15:00:00 2,3
    2010-07-01 15:00:03 2,5
    2010-07-01 15:00:06 2,2
    2010-07-01 15:00:09 2,1

    Hat jemand eine Idee?
    Ich stehe gerade ein bisschen auf dem Schlach.

    Vielen Dank im Vorraus,
    Robert
    Code:
    test=*# select * from nioc limit 10;
             ts          |       value
    ---------------------+--------------------
     2010-08-25 00:00:00 |  0.619806560687721
     2010-08-25 00:00:01 |   0.45592790003866
     2010-08-25 00:00:02 |  0.208332412410527
     2010-08-25 00:00:03 |  0.467778811231256
     2010-08-25 00:00:04 |  0.709810342639685
     2010-08-25 00:00:05 |  0.147713274229318
     2010-08-25 00:00:06 |  0.684980425052345
     2010-08-25 00:00:07 | 0.0645707873627543
     2010-08-25 00:00:08 |  0.397614741697907
     2010-08-25 00:00:09 |  0.688825995661318
    (10 rows)
    
    test=*# select * from nioc where mod((extract(epoch from ts))::int ,3) = 0 limit 10;
             ts          |       value
    ---------------------+-------------------
     2010-08-25 00:00:00 | 0.619806560687721
     2010-08-25 00:00:03 | 0.467778811231256
     2010-08-25 00:00:06 | 0.684980425052345
     2010-08-25 00:00:09 | 0.688825995661318
     2010-08-25 00:00:12 | 0.884086264297366
     2010-08-25 00:00:15 | 0.139217745512724
     2010-08-25 00:00:18 | 0.252522758208215
     2010-08-25 00:00:21 | 0.303016524761915
     2010-08-25 00:00:24 | 0.095765620470047
     2010-08-25 00:00:27 | 0.735997097566724
    (10 rows)
    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum