2016-12-11 7 views
0

ich eine Frage für SQL Group By Statement habenSQL Group By Statement

Zuerst Dies ist mein Tisch -> TEMP_DATA

id | a_id  |  date_time   | length | <br> 
1074 | 3 | 2016-12-07 09:13:13.490 | 1.036013 | <br> 
1075 | 1 | 2016-12-07 09:13:13.690 | 1.699601 | <br> 
1076 | 0 | 2016-12-07 09:13:13.867 | 2.110443 | <br> 
1077 | 3 | 2016-12-07 09:13:14.490 | 1.027660 | <br> 
1078 | 1 | 2016-12-07 09:13:14.690 | 1.742645 | <br> 
1079 | 0 | 2016-12-07 09:13:14.867 | 2.121963 | <br> 
1080 | 2 | 2016-12-07 09:13:18.390 | 4.008482 | <br> 

versuche ich select id, a_id, date_time, Länge für 3 verschiedene a_id bestellen von ID asc so verwende ich diese

SELECT DISTINCT 
    a_id, 
    Min(id) id,   
    Min(Last_Data.lenght) lenght, 
    (Select date_time from temp_data 
    where temp_data.id = Min(Last_Data.id)) last_time 
FROM (
    SELECT * 
    FROM temp_data 
    where id >= 1074 and id <= 1080 
) Last_Data 
GROUP BY a_id 
order by id asc 

Das Ergebnis

id | a_id  |  last_time   | length | <br> 
1074 | 3 | 2016-12-07 09:13:13.490 | 1.013928 | <br> 
1075 | 1 | 2016-12-07 09:13:13.690 | 1.699601 | <br> 
1076 | 0 | 2016-12-07 09:13:13.867 | 2.110443 | <br> 
ist

Ich bekomme falsche Länge für ID. Wie kann ich dieses Problem lösen?

P.S. : Zuerst bekomme ich 3 verschiedene a_id in dieser Tabelle. Dann verwende ich Select Top 3 * Aussage. Weil zwei gleiche a_id hintereinander kommen können. Zum Beispiel

id | a_id  |  date_time   | length | <br> 
1074 | 1 | 2016-12-07 09:13:13.490 | 1.013928 | <br> 
1075 | 1 | 2016-12-07 09:13:13.690 | 1.699601 | <br> 
+0

Ihre Anfrage 'last_time' wählt, aber es gibt keine solche Spalte im Ergebnis angegeben ... Auch unterschiedliche Spaltenreihenfolge – jarlh

+0

@jarih Ich repariere es – BK52

+0

welche RDMS verwendest du? Die Antwort kann davon abhängen. – trincot

Antwort

0

könnten Sie verwenden die first_value analytische Funktion mit der over Klausel:

select a_id, 
     min(id) id,   
     first_value(length) over (partition by a_id order by id) length, 
     first_value(date_time) over (partition by a_id order by id) last_time 
where id >= 1074 and id <= 1080 
group by a_id 
order by 2 asc 
0
;with cteData as 
( 
    SELECT 
     t.a_id, t.id, t.date_time, t.lenght, 
     row_number() over(partition by t.a_id order by t.date_time desc) rn 
    FROM temp_data t 
    where id >= 1074 and id <= 1080 
) 
select 
    d.a_id, d.id, d.date_time as last_date_time, t.length 
from cteData d 
where d.rn = 1