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