在MySQL中按顺序、分组和按日期枚举记录
这似乎是一个很简单的问题,我害怕自己会被重复的问题锤砸到,但我得到的是:在MySQL中按顺序、分组和按日期枚举记录,mysql,group-by,enumerate,Mysql,Group By,Enumerate,这似乎是一个很简单的问题,我害怕自己会被重复的问题锤砸到,但我得到的是: 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
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
我曾尝试使用分组方式
,但它不起作用,如中所示
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
输出:
您可以忽略输出中的buffer\u id
列-它与结果无关,但需要重置rank
说明:
变量根据输出的排序顺序跟踪行中的每个id。在初始迭代中,我们将其设置为最终结果中可能获得的第一条记录的@id
。请参见子查询id
从q43381823中选择q2.id作为q2订单,按q2.id限制1
最初设置为@rank
,默认情况下,对于结果集中的每个后续行,都会递增。但是,当0
更改时,我们将其重置为id
。请参阅此查询中的1
构造CASE-WHEN-ELSE
- 最终输出首先按
排序,然后按id
排序。这可确保在同一dt
内的每个后续id
字段中增量设置dt
,但每当新的@rank
组开始显示在结果集中时,会重置为id
1
CASE-when
构造来模拟它。您可以如下阅读:当(x>=1)使用@rank时,否则(即默认值)将@rank初始化为1
。您会注意到,x
实际上是IF(条件,true,false)
。也就是说,如果当前行的id(qid)与前一行的id(@id)不同,则将“x”重置为0,否则将“x”增加1
。这会在id
发生更改时将@rank
重置为1
,否则它会不断增加。请注意,当如果返回x
为0
时,案例
立即使用默认值
将其设置为1
@Barbz_YHOOL Yes,您是对的。在这种特殊情况下,需要将行枚举为1、2、3。。。。请参阅此页了解有关MySQLIF()
函数的更多信息。如果这篇文章有帮助的话,那肯定是个好消息。谢谢但是,如果你认为你可能想得到一个关于代码是否有效的意见,你可以考虑为你的具体问题发布一个新的问题。谁知道呢,也许有一种更简单的方法可以得到你想要的东西?
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