2013-03-05 93 views
-2

考慮表「T1」分組:SQL查詢來選擇「名」以最小的「時間戳」,由「group_fk」

+------------------------------+ 
| timestamp | name | group_fk | 
+------------+------+----------+ 
| 1362297600 | abc | 41  | 
| 1362384000 | bcd | 41  | 
| 1362470400 | cde | 41  | 
| 1362556800 | def | 42  | 
| 1362643200 | efg | 42  | 
+------------------------------+ 

我需要選擇「名」,在每個「最小的「時間戳」 group_fk」。所以結果應該是:「abc」和「def」。

我知道醜陋的(而且並不總是正確的)的方式來做到這一點:

select name 
from t1 
where t1.timestamp IN (
    select min(t1_inner.timestamp) 
    from t1 t1_inner 
    group by t1_inner.group_fk 
) 

有沒有更好的解決辦法?

- DM

+0

「更好」 在何種意義上,到底是什麼? – 2013-03-05 23:50:33

+0

哪些是dbms? – 2013-03-05 23:53:52

回答

2

這可以通過許多不同的方式,包括使用子查詢:

select t1.name, t2.minval 
from table1 t1 
inner join 
(
    select min(timestamp) MinVal, 
    group_fk 
    from table1 
    group by group_fk 
) t2 
    on t1.timestamp = t2.minval 
    and t1.group_fk = t2.group_fk 

SQL Fiddle with Demo

或者,如果你的數據庫窗口函數,你可以使用row_number()

select name, timestamp 
from 
(
    select name, timestamp, 
    row_number() over(partition by group_fk order by timestamp) rn 
    from table1 
) src 
where rn = 1 

SQL Fiddle with Demo