假設表格如下:
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
設置遞增,以後每場dt
同id
內,但每當一個新的id
組開始在結果集中顯示被重置爲1
。
我愛你!非常感謝。我從來不會想到這一點。特別感謝您的出色解釋。 –
謝謝。很高興幫助! –