mysql - 如何使用 MySQL 对连续范围进行分组

标签 mysql gaps-and-islands date-range

我有一个包含类别、日期和费率的表格。每个类别在不同日期可以有不同的费率,一个类别在给定日期只能有一个费率。

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 中做同样的事情? 请帮忙!

最佳答案

MySQL 不支持分析函数,但您可以使用 user-defined variables 模拟此类行为:

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 - 如何使用 MySQL 对连续范围进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12276087/

相关文章:

mysql - 在 SQL 插入中添加破折号而不进行计算

mysql - 如何在 MySQL 中按最后重复项对记录进行分组?

sql - 标记不连续的日期范围

SQL CHECK 约束以防止日期重叠

mysql - SQL中如何将字符串拆分为单列并排列在同一列中

Python,存储列表并插入到表的一列中

sql - 返回最新的 'streak' 数据行

python - 循环遍历 pandas 数据框以生成日期范围

php - 如果存在更新记录,否则写入新记录?

sql - 如何从 Oracle SQL 中的连续列获取运行总计