我有一个包含类别,日期和费率的表。每个类别在不同日期可以具有不同的费率,一个类别在给定日期只能具有一个费率。
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 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中做同样的事情?请帮忙!
MySQL不支持解析功能,但是您可以使用用户定义的变量来模仿这种行为:
SELECT CatID, Begin, MAX(Date) AS End, Rate FROM ( SELECT my_table.*, @f:=CONVERT( IF(@c<=>CatId AND @r<=>Rate AND DATEDIFF(Date, @d)=1, @f, Date), DATE ) AS Begin, @c:=CatId, @d:=Date, @r:=Rate FROM my_table JOIN (SELECT @c:=NULL) AS init ORDER BY CatId, Rate, Date ) AS t GROUP BY CatID, Begin, Rate
在sqlfiddle上看到它。