MySQL:使用组的最早日期来确定每行的排名

MySQL: use group's earliest date to determine each row's rank

我想根据最早日期对行进行排名。但是,如果一行的兄弟(同一组中的行)具有更高的排名,这将影响他们的排名。

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

似乎您可以将现有查询嵌套为内嵌视图,然后 运行 再次排名。

未测试:

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

我将您的 table 重命名为 test1,将 group 列重命名为 groupp,因为 group 是保留字。

以下查询将为您提供所需的结果

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 将为您获取 table 中的所有记录。 当您在列 groupp 上加入这两个时,您基本上会根据第一个查询的结果从 table 中获得具有适当排名的所有记录。 然后你只需按排名和日期排序。

我测试了查询,returns 得到了想要的结果 sql fiddle

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