如何使用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    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上看到它。

以上是 如何使用MySQL对连续范围进行分组 的全部内容, 来源链接: utcz.com/qa/417500.html

回到顶部