2016-12-06 245 views
2

此問題已被提問和回答多次,但我的情況有點不同。SQL ORDER BY GROUP BY

說我有這樣的數據:

------------------------------ 
| id  | date   | 
------------------------------ 
| 1  | 2016-07-15  | 
| 1  | 2016-07-16  | 
| 2  | 2016-07-24  | 
| 2  | 2016-07-25  | 
| 1  | 2016-07-29  | 
| 1  | 2016-07-30  | 
------------------------------ 

我想先順序由date列,然後組由id列,並採取max(date)每個id

這樣id=1出現兩次,我會得到這個

------------------------------ 
| id  | max(date)  | 
------------------------------ 
| 1  | 2016-07-16  | 
| 2  | 2016-07-25  | 
| 1  | 2016-07-30  | 
------------------------------ 

通知,因爲的id=1造成2個獨立的「組」,在它們之間的一組id=2順序。

我的意思是我希望group by函數只將order by子句中相鄰值相鄰的行組合在一起。

我該怎麼做?

+0

什麼是最大的時間差使得兩者的差異使得放入單個組中的日期? – 1000111

+0

@ 1000111沒有「差異限制」。問題是,我只想將'order by'子句中相鄰的相同'id'的行組合在一起。 – Malki

+0

您的表中沒有任何主鍵嗎? – 1000111

回答

4

我想你應該在這裏使用變量。

select id, `date` 
from (
    select 
     id, 
     `date`, 
     @rowno := case when @grp = id then @rowno + 1 else 0 end as rowno, 
     @grp := id 
    from (
     select * 
     from yourtable 
     order by `date` desc 
    ) t1 
    cross join (select @grp := null, @rowno = 0) t2 
) main 
where main.rowno = 0 
order by `date`; 

內部查詢將組織這樣的記錄,

--------------------------------------------- 
| id  | date   | rowno | @grp | 
--------------------------------------------- 
| 1  | 2016-07-30  | 0  | 1 | 
| 1  | 2016-07-29  | 1  | 1 | 
| 2  | 2016-07-25  | 0  | 2 | 
| 2  | 2016-07-24  | 1  | 2 | 
| 1  | 2016-07-16  | 0  | 1 | 
| 1  | 2016-07-15  | 1  | 1 | 
--------------------------------------------- 

然後在where子句rowno = 0會得到你想要的東西。

SQLFiddle Demo

+0

這將返回第一個日期而不是每個ID的最後日期。 –

+0

這似乎很聰明,是否在'main'中沒有'ORDER BY'保證的順序? – mendosi

+0

@P.Salmon我已經測試過它,你也可以在sqlfiddle中運行這個查詢,但它看起來很糟糕。 – Blank