2013-10-17 93 views
0

考慮下表:在GROUP返回多列BY查詢

tbl_start_times 

    id mach_id start_time 
    -- ------- ---------- 
    1 1  00:12 
    2 3  05:18 
    3 1  03:56 
    4 2  01:51 
    5 1  12:48 
    6 2  00:10 
    7 3  09:15 

我想回到ID,mach_id和MIN(START_TIME)每個mach_id。

代碼:

SELECT mach_id, MIN(start_time) FROM tbl_start_times GROUP BY mach_id 

返回此結果:

mach_id start_time 
    ------- ---------- 
    1  00:12 
    3  05:18 
    2  00:10 

我怎樣才能將ID添加到我的結果讓我得到這個?

id mach_id start_time 
    -- ------- ---------- 
    1 1  00:12 
    2 3  05:18 
    6 2  00:10 
+0

只需通過組ID和mach_Id? – Andrew

+0

當你用'mach_id'分組時,'id'可能不是唯一的。你可以看到任何一個可能很多'id's? – unutbu

+0

我想要從與MIN(start_time)返回的值相同的行中的id –

回答

0

試試這個:

SELECT t.id , t.mach_id, t.start_time 
FROM tbl_start_times t, 
    (SELECT mach_id, MIN(start_time) as start_time 
    FROM tbl_start_times 
    GROUP BY mach_id) t1 
WHERE t.mach_id=t1.mach_id AND t.start_time=t1.start_time 
1

可以按如下方式與做相關子查詢

SELECT id, mach_id, start_time 
FROM tbl_start_times tst 
WHERE start_time = (SELECT MIN(start time) 
        FROM tbl_start_times tst2 
        WHERE tst2.mach_id = tst.mach_id) 
ORDER BY id 

SQL Fiddle

2

有兩種方法可以做到這一點在Postgres:

使用Postgres的具體distinct on()操作:

SELECT distinct on (match_id) id, match_id, start_time 
FROM tbl_start_times 
ORDER BY match_id, start_time; 

或者使用窗口函數:

with numbered_times as (
    select id, match_id, start_time, 
      row_number() over (partition by match_id order by start_time) as rn 
    from tbl_start_times 
) 
select id, match_id, start_time 
from numbered_times 
where rn = 1; 

這也可以讓你輕鬆挑選「第二」或「第四」行,而不是隻有「 (或最小/最大解決方案)

如果多行是「最低」(即最低/最高解決方案)具有相同的最低時間相同match_id)你想看到所有的人,使用dense_rank()代替row_number()

解決方案與distinct on通常比使用窗函數相應的解決方案快。窗口函數是標準的SQL,並且在幾乎所有現代DBMS上運行。兩種版本通常都比使用子查詢或派生表的解決方案更快,因爲只需要單次傳遞來讀取數據。

SQLFiddle例如:http://sqlfiddle.com/#!12/caa95/5