2016-11-16 3 views
1

n_stationAbfrage - spätestes Datum aus anderer Tabelle und die verknüpften Daten

code_stas nom_station 
1   StationA 
2   StationB 
3   StationC 

val_horaire

code_mesure date_val_hor h_01 h_02 h_03 
1   14/11/2016  23  29  32 
1   15/11/2016  45  47  35 
2   14/11/2016  12  15  13 
2   15/11/2016  21  23  19 
3   14/11/2016  74  75  79 

Ich mag die letzte (Datum) Zeile der Tabelle erhalten val_horaire und verbinden Sie es mit Tabelle n_station

Ergebnis

cod_stas nom_station date_val_hor h_01 h_02 h_03 
1   StationA 15/11/2016  45  47  35 
2   StationB 15/11/2016  21  23  19 
3   StationC 14/11/2016  74  75  79 

Wie kann ich das erreichen? Die folgende Abfrage funktioniert nicht

SELECT st.code_stas, st.nom_station, max(vh.date_val_hor), vh.h_01, vh.h_02, vh.h_03 
FROM n_station st 
INNER JOIN val_horaire vh 
ON st.code_stas = vh.code_mesure 
GROUP BY st.code_stas, st.nom_station, vh.h_01, vh.h_02, vh.h_03 

Dies wird mir zeigen, mehrmals Station

+0

Setzen Sie den Ausdruck max function auf vh.h_01, vh.h_02, vh.h_03, und löschen Sie die Spalten aus der Gruppe by. ist es Arbeit? – Ming

+0

@ Mannix.Zhu Aber ich will nicht die maximale h_01, h_02, ... + Fehler 'ungültige Anzahl von Argumenten' – Weedoze

+0

Got it. Ich habe falsch verstanden, was du machen willst. Überprüfen Sie meine Antwort. – Ming

Antwort

1

Lösung No.1:

SELECT 
    st.code_stas, 
    st.nom_station, 
    MAX(vh.date_val_hor) KEEP(DENSE_RANK FIRST ORDER BY st.nom_station DESC) AS date_val_hor, 
    MAX(vh.h_01) KEEP(DENSE_RANK FIRST ORDER BY st.nom_station DESC) AS h_01, 
    MAX(vh.h_02) KEEP(DENSE_RANK FIRST ORDER BY st.nom_station DESC) AS h_02, 
    MAX(vh.h_03) KEEP(DENSE_RANK FIRST ORDER BY st.nom_station DESC) AS h_03 
FROM 
    n_station st, 
    val_horaire vh 
WHERE 
    st.code_stas = vh.code_mesure 
GROUP BY st.code_stas, st.nom_station 

Lösung Nr. 2:

SELECT code_stas, nom_station, h_01, h_02, h_03 FROM (
    SELECT 
     st.code_stas, 
     st.nom_station, 
     vh.date_val_hor, 
     vh.h_01, 
     vh.h_02, 
     vh.h_03, 
     ROW_NUMBER() OVER(PARTITION BY st.code_stas, st.nom_station ORDER BY vh.date_val_hor DESC) AS DISTINCT_FLG 
    FROM 
     n_station st, 
     val_horaire vh 
    WHERE 
     st.code_stas = vh.code_mesure 
) 
WHERE DISTINCT_FLG = 1 
+0

Die zweite Lösung scheint zu funktionieren – Weedoze

+0

Wie kann ich eine 'INNER JOIN' mit einer anderen Tabelle hinzufügen? Die andere Tabelle enthält den 'Code' und einen' Gruppennamen'. Ich muss die Station mit einem bestimmten Gruppennamen nehmen nur – Weedoze

+0

[st.code_stas = vh.code_mesure] ist gleich dem [INNER JOIN] in Ihrem SQL. Einfach INNER JOIN dein neuer Tisch. Aber vielleicht sollten Sie die Spalten in [GROUP BY] ändern, wenn der Primärschlüssel Ihrer neuen Tabelle nicht der [Code] ist. – Ming

0

So etwas (?):

SELECT st.code_stas, st.nom_station, zzz.MAX_date_val_hor, vh.h_01, vh.h_02, vh.h_03 
FROM (SELECT code_mesure, MAX(date_val_hor) AS MAX_date_val_hor FROM val_horaire GROUP BY code_mesure) ZZZ 
INNER JOIN 
n_station st ON st.code_stas=zzz.code_mesure 
INNER JOIN val_horaire vh 
ON st.code_stas = vh.code_mesure 
GROUP BY st.code_stas, st.nom_station, zzz.MAX_date_val_hor, vh.h_01, vh.h_02, vh.h_03; 
+0

Ich habe mehrmals die gleiche Station – Weedoze

Verwandte Themen