2017-04-13 45 views
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 

这与this question非常相似,但它不适用于我。 This会很棒,但它不是MySQL。

我试着使用group by但它不会在

SELECT ta.*, count(*) as Num 
FROM temp_a ta 
GROUP BY `ID` ORDER BY `ID`; 

工作,因为这显然不运行以来,始终GROUP BY结果一个值。

任何意见不胜感激。

回答

2

假设表格如下:

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 Fiddle Demo



说明:

  • @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排序。这确保了@rank设置递增,以后每场dtid内,但每当一个新的id组开始在结果集中显示被重置为1

+0

我爱你!非常感谢。我从来不会想到这一点。特别感谢您的出色解释。 –

+0

谢谢。很高兴帮助! –