2017-04-13 74 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

謝謝。很高興幫助! –