这似乎是一个简单的问题,我害怕我可能会被重复的问题锤子抨击,但这是我所拥有的:
ID Date
1 1/11/01
1 3/3/03
1 2/22/02
2 1/11/01
2 2/22/02
我需要做的就是根据日期枚举记录,并按ID
分组! 因此:
ID Date Num
1 1/11/01 1
1 3/3/03 3
1 2/22/02 2
2 1/11/01 1
2 2/22/02 2
这与这个问题非常相似,但它对我不起作用。这会很棒,但它不是MySQL。
我尝试使用group by
但它不起作用,如
SELECT ta.*, count(*) as Num
FROM temp_a ta
GROUP BY `ID` ORDER BY `ID`;
这显然不会运行,因为GROUP BY
总是产生一个值。
任何建议都非常感谢。
让我们假设该表如下所示:
CREATE TABLE q43381823(id INT, dt DATE);
INSERT INTO q43381823 VALUES
(1, '2001-01-11'),
(1, '2003-03-03'),
(1, '2002-02-22'),
(2, '2001-01-11'),
(2, '2002-02-22');
然后,编写查询以获取所需输出的方法之一是:
SELECT q.*,
CASE WHEN (
IF(@id != q.id, @rank := 0, @rank := @rank + 1)
) >=1 THEN @rank
ELSE @rank := 1
END as rank,
@id := q.id AS buffer_id
FROM q43381823 q
CROSS JOIN (
SELECT @rank:= 0,
@id := (SELECT q2.id FROM q43381823 AS q2 ORDER BY q2.id LIMIT 1)
) x
ORDER BY q.id, q.dt
输出:
id | dt | rank | buffer_id
-------------------------------------------------
1 | 2001-01-11 | 1 | 1
1 | 2002-02-22 | 2 | 1
1 | 2003-03-03 | 3 | 1
2 | 2001-01-11 | 1 | 2
2 | 2002-02-22 | 2 | 2
您可以忽略输出中的buffer_id
列 - 它与结果无关,但重置rank
是必需的。
SQL 小提琴演示
解释:
@id
变量根据输出的排序顺序跟踪行中的每个 id。在初始迭代中,我们将其设置为最终结果中可能获得的第一条记录的id
。请参阅子查询SELECT q2.id FROM q43381823 AS q2 ORDER BY q2.id LIMIT 1
@rank
设置为最初0
,默认情况下,结果集中的每一行都递增。但是,当id
发生变化时,我们会将其重置回1
.请参阅查询中的CASE - WHEN - ELSE
构造。最终输出首先按
id
排序,然后按dt
排序。这可确保为同一id
中的每个后续dt
字段增量设置@rank
,但每当新的id
组开始显示在结果集中时,都会重置为1
。