我有一个包含类别、日期和费率的表格。每个类别在不同的日期可能有不同的费率,但在给定日期,每个类别只能有一个费率。
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
我在论坛中找到了一个类似的解决方案,但并没有得到预期结果。
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,Rate)=(14,1)
时,结果范围显示为2009-07-08
到2009-07-10
,而底层表中并没有2009-07-09
这一日期?与之相比,(CatId,Rate)=(12,1)
由于其不连续性产生了两个结果范围。 - eggyal