2016-12-01 29 views
0

我想根據其最早的日期對行進行排名。但是,如果一行的同胞(同一組內的行)的排名較高,則會影響他們的排名。MySQL:使用組的最早日期來確定每行的排名

id | group | date 
1  11  2016-12-1 
2  11  2016-01-1 
3  22  2016-02-1 
4  22  2016-05-1 
5  3  2016-04-1 
6  3  2016-06-1 

目前:

SELECT *, @curRank := @curRank + 1 AS rank 
FROM table 
SELECT @curRank := 0) r 
ORDER BY date ASC 

id | group | date  | rank 
2  11  2016-01-1 1 
3  22  2016-02-1 2 
5  3  2016-04-1 3 
4  22  2016-05-1 4 
6  3  2016-06-1 5 
1  11  2016-12-1 6 

我需要實現

id | group | date  | rank 
2  11  2016-01-1 1 
1  11  2016-12-1 6 
3  22  2016-02-1 2 
4  22  2016-05-1 4 
5  3  2016-04-1 3 
6  3  2016-06-1 5 
+1

我想你想/必須採取2次在此。第一次通過採用每個組的最低日期並排列這些日期,然後根據該組的排名順序重新排列日期。 – xQbert

+0

這些羣體可以有多個兄弟姐妹,因此我不確定該羣組中的第3,第4 ...項如何/是否適用。 – Kris

回答

1

我改名的表TEST1和組列groupp因爲組是一個保留字。

下面的查詢會給你想要的結果

SELECT t1.* 
FROM (SELECT id, groupp, min(date), @rownum := @rownum + 1 as rank 
     FROM test1, (SELECT @rownum := 0) r 
     GROUP BY groupp 
     ORDER BY date ASC) qry 
INNER JOIN test1 t1 on t1.groupp = qry.groupp 
ORDER BY qry.rank, t1.date asc; 

標有QRY將讓你對每個groupp最小日期的記錄的查詢。 查詢t1會從表中獲取所有記錄。 當你在column groupp上加入這兩個時,你基本上會根據第一個查詢的結果從該表中獲取所有記錄,並使用適當的排名。 然後,您只需按排名和日期排序。

我測試的查詢並返回與SQL小提琴期望的結果

http://sqlfiddle.com/#!9/90dee/1

+0

您應該解釋邏輯或提供一些條款。 –

0

好像你可以只窩現有查詢的內聯視圖,然後再次運行的排名。

UNTESTED:

SELECT Z.*, @newRank := @newRank + 1 as NewRank 
FROM (SELECT *, @curRank := @curRank + 1 AS rank 
     FROM foo 
     CROSS JOIN (SELECT @curRank := 0) r 
     ORDER BY mdate ASC) Z 
CROSS JOIN (Select @newRank :=0) 
ORDER BY rank, mdate