# Knifflige Datenabfrage

**URL:** <https://www.pg-forum.de/t/knifflige-datenabfrage/11957>\
**Category:** SQL\
**Created:** [27. Mai 2020 um 09:33 UTC](https://www.pg-forum.de/t/knifflige-datenabfrage/11957 "2020-05-27T09:33:50Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![anon40162420](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/3da27b/32.png) [@anon40162420](https://www.pg-forum.de/u/anon40162420)\
**Post date:** [27. Mai 2020 um 09:33 UTC](https://www.pg-forum.de/t/knifflige-datenabfrage/11957/1 "2020-05-27T09:33:50Z")

</div>

Hallo zusammen,

für mein Projekt habe ich zwei Tabellen:  
Tabelle 1: Wetterstationen mit primary key iaco (= internationales Kürzel des Stationsnamens)  
Tabelle 2: Wetterdaten, pro Station 25 Einträge

Bisher habe ich per PHP-Skript folgendes gemacht:  
Tabelle 1 auslesen  
Schleife über alle Stationen  
Wetterdatenabfrage für jede einzelne Station  
Ausgabe der Wetterdaten  
Schleifenende

Wenn möglich, möchte ich das in eine Query packen. Ich stehe da irgendwie voll auf dem Schlauch, auch wenn ich einen Schritt zu Seite gehe, steh ich immer noch drauf 😃

Für sachdienliche Hinweise bin ich dankbar.

Die Wetterdatenabfrage - es wird immer die aktuellste Wettermeldung ausgegeben - sieht wie folgt aus:

```auto
    SELECT *,((datum + INTERVAL '200' MINUTE) > utc_timestamp()),-1 AS uvindex 
    		FROM t_wetterdaten_synop 
    		WHERE iaco='%s' AND ((datum + INTERVAL '200' MINUTE) > utc_timestamp()) 
    		ORDER BY datum DESC LIMIT 1
```

%s = Stationskürzel aus Tabelle 1

Im Voraus besten Dank für die Antworten

Jürgen

---

<div class="post-metadata">

**Author:** ![akretschmer](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/a6a055/32.png) [@akretschmer](https://www.pg-forum.de/u/akretschmer)\
**Post date:** [27. Mai 2020 um 10:09 UTC](https://www.pg-forum.de/t/knifflige-datenabfrage/11957/2 "2020-05-27T10:09:40Z")

</div>

Bin mir nicht sicher, dich richtig zu verstehen. Du hast eine Tabelle mit den Stationen und je Station dann Messwerte und willst den aktuellsten Meßwert je Station, oder?

```
test=*# select * from stationen ;
 iaco | name    
-------+-----------
 iaco1 | station 1
 iaco2 | station 2
 iaco3 | station 3
(3 rows)

test=*# select * from daten ;
 iaco | ts | wert 
-------+---------------------+------
 iaco1 | 2020-01-01 00:00:00 | 10
 iaco2 | 2020-01-01 00:00:00 | 12
 iaco3 | 2020-01-01 00:00:00 | 13
 iaco1 | 2020-02-01 00:00:00 | 5
 iaco2 | 2020-02-01 00:00:00 | 4
 iaco3 | 2020-02-01 00:00:00 | 7
 iaco1 | 2020-03-01 00:00:00 | 9
 iaco2 | 2020-03-01 00:00:00 | 12
 iaco3 | 2020-03-01 00:00:00 | 11
(9 rows)

test=*# select distinct on (s.iaco, s.name) s.iaco, s.name, d.ts, wert from stationen s left join daten d on s.iaco=d.iaco order by s.iaco, s.name, d.ts desc;
 iaco | name | ts | wert 
-------+-----------+---------------------+------
 iaco1 | station 1 | 2020-03-01 00:00:00 | 9
 iaco2 | station 2 | 2020-03-01 00:00:00 | 12
 iaco3 | station 3 | 2020-03-01 00:00:00 | 11
(3 rows)

```

DISTINCT ON ist eine Erweiterung in PostgreSQL - und ziemlich cool. Dein utc\_timestamp() gehört nicht zu den Grundfunktionen in PG, oder?

---

<div class="post-metadata">

**Author:** ![frastr](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/f/919ad9/32.png) [@frastr](https://www.pg-forum.de/u/frastr)\
**Post date:** [27. Mai 2020 um 10:19 UTC](https://www.pg-forum.de/t/knifflige-datenabfrage/11957/3 "2020-05-27T10:19:50Z")

</div>

Ich würde es in etwa so schreiben. Da die Tabellen mir ja nicht genau bekannt sind.

```
with wetterdaten as (
	select d.*,((d.datum + INTERVAL '200' MINUTE) > utc_timestamp()),-1 AS uvindex
			, row_number() over (partition by d.iaco order by d.datum desc) as rownum_iaco
		from t_wetterstation s
		join t_wetterdaten_synop d on d.iaco = s.iaco
			and ((d.datum + INTERVAL '200' MINUTE) > utc_timestamp())
)
select * 
	from wetterdaten
	where rownum_iaco = 1
;
```

---

<div class="post-metadata">

**Author:** ![anon40162420](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/3da27b/32.png) [@anon40162420](https://www.pg-forum.de/u/anon40162420)\
**Post date:** [27. Mai 2020 um 11:12 UTC](https://www.pg-forum.de/t/knifflige-datenabfrage/11957/4 "2020-05-27T11:12:48Z")

</div>

@akretschmer  
Danke für Deine Antwort.

> [@akretschmer](#):
>
> Du hast eine Tabelle mit den Stationen und je Station dann Messwerte und willst den aktuellsten Meßwert je Station, oder?

Genau.

> [@akretschmer](#):
>
> DISTINCT ON ist eine Erweiterung in PostgreSQL - und ziemlich cool.

Das werde ich mir genauer ansehen.

> [@akretschmer](#):
>
> utc\_timestamp()

Die Funktion hatte ich mir nur aus Schreibfaulheit mal geschrieben und leistet immer noch gute Dienste 🙂

@frastr  
Ebenfalls Danke für Deine Antwort.  
Ich hatte die beiden Tabellenstruktutren nicht gepostet, weil sie 24 bzw. 38 Spalten haben und schon bis zum Anschlag normalisiert sind.  
Deine Query muss ich mal analysieren und versuchen zu verstehen.  
Bei Fragen melde ich mich wieder 😃

Hier das Ergebnis des Istzustands:  
[https://juedan.nerdcamp.net/PHPSkripte/wetterdienst\_karte.php?typ=wetterkarte&lkz=DE-BAYALPEN](https://juedan.nerdcamp.net/PHPSkripte/wetterdienst_karte.php?typ=wetterkarte&lkz=DE-BAYALPEN)  
So soll es hinterher auch wieder aussehen 😃

Beste Grüße und nochmals Danke

Jürgen

---

<div class="post-metadata">

**Author:** ![anon40162420](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/3da27b/32.png) [@anon40162420](https://www.pg-forum.de/u/anon40162420)\
**Post date:** [27. Mai 2020 um 17:58 UTC](https://www.pg-forum.de/t/knifflige-datenabfrage/11957/5 "2020-05-27T17:58:56Z")

</div>

@frastr  
Eine Verständnisfrage zu Deinem Query-Beispiel habe ich noch:  
Was macht

```auto
row_number() over (partition by d.iaco order by d.datum desc) as rownum_iaco
```

?

Im Voraus Danke für die Antwort.

Grüßle Jürgen

---

<div class="post-metadata">

**Author:** ![akretschmer](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/a6a055/32.png) [@akretschmer](https://www.pg-forum.de/u/akretschmer)\
**Post date:** [27. Mai 2020 um 18:38 UTC](https://www.pg-forum.de/t/knifflige-datenabfrage/11957/6 "2020-05-27T18:38:11Z")

</div>

row\_number() ist eine sog. Window-Funktion, die die Zeilen zählt, unterteilt (partition by) nach der iaco-Spalte und sortiert (order by) nach dem Datum (desc, absteigend).

---

<div class="post-metadata">

**Author:** ![frastr](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/f/919ad9/32.png) [@frastr](https://www.pg-forum.de/u/frastr)\
**Post date:** [27. Mai 2020 um 19:51 UTC](https://www.pg-forum.de/t/knifflige-datenabfrage/11957/7 "2020-05-27T19:51:35Z")

</div>

@akretschmer: Danke für deine schnelle Antwort

@anon40162420: Es wird also das End-Ergebnis (nach dem Join und where) genommen. Dann wird die Spalte iaco in Partitionen unterteilt, selbe icao gehören zu einer Partition und innerhalb jeder Partition nach dem Datum absteigend sortiert). Dann bekommt jeder Datensatz eine laufende Nummer von 1 aufsteigend (in Spalte rownum\_iaco).

---

<div class="post-metadata">

**Author:** ![anon40162420](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/3da27b/32.png) [@anon40162420](https://www.pg-forum.de/u/anon40162420)\
**Post date:** [28. Mai 2020 um 05:15 UTC](https://www.pg-forum.de/t/knifflige-datenabfrage/11957/8 "2020-05-28T05:15:39Z")

</div>

Moin, moin.

Jetzt verstehe ich die Query vollständig. Danke Euch für die Erklärung.

Schönen Tag noch

Jürgen

---

<div class="post-metadata">

**Author:** ![system](https://www.pg-forum.de/uploads/default/original/1X/dc97a981dd26692d5fb52e8b8fc7c090d7b9559a.png) [@system](https://www.pg-forum.de/u/system)\
**Post date:** [21. Februar 2021 um 07:08 UTC](https://www.pg-forum.de/t/knifflige-datenabfrage/11957/9 "2021-02-21T07:08:56Z")

</div>


