我有一個包含類別,日期和費率的表。每個類別在不同的日期可以有不同的費率,一個類別在給定的日期只能有一個費率。如何使用MySQL對連續範圍進行分組
Id CatId Date Rate
------ ------ ------------ ---------
000001 12 2009-07-07 1
000002 12 2009-07-08 1
000003 12 2009-07-09 1
000004 12 2009-07-10 2
000005 12 2009-07-15 1
000006 12 2009-07-16 1
000007 13 2009-07-08 1
000008 13 2009-07-09 1
000009 14 2009-07-07 2
000010 14 2009-07-08 1
000010 14 2009-07-10 1
唯一索引(CATID,日期,價格) 我想對於每個類別組的所有連續日期範圍,只保留開始和範圍的結束。 對於前面的例子中,我們將有:
CatId Begin End Rate
------ ------------ ------------ ---------
12 2009-07-07 2009-07-09 1
12 2009-07-10 2009-07-10 2
12 2009-07-15 2009-07-16 1
13 2009-07-08 2009-07-09 1
14 2009-07-07 2009-07-07 2
14 2009-07-08 2009-07-08 1
14 2009-07-10 2009-07-10 1
我發現the forum類似的解決方案,它並沒有完全放棄的結果
WITH q AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY CatId, Rate ORDER BY [Date]) AS rnd,
ROW_NUMBER() OVER (PARTITION BY CatId ORDER BY [Date]) AS rn
FROM my_table
)
SELECT CatId AS catidd, MIN([Date]) as beginn, MAX([Date])as endd, Rate
FROM q
GROUP BY CatId, rnd - rn, Rate
查閱SQL FIDDLE 我如何做同樣的事情在MySQL ? 請幫忙!
爲什麼你的例子顯示了'(CATID,率)=( 14,1)'當基礎表中沒有'2009-07-09'時,從'2009-07-08'到'2009-07-10'的結果範圍? C.F. (CatId,Rate)=(12,1)',由於它的不連續性,它會產生兩個結果範圍。 – eggyal
感謝eggyal,現在它已更正 – Fouzi