mysql - 如何排除使用 mysql 窗口函数创建的日期范围中的间隙?

标签 mysql sql

我每个工作日都有销售额(第四个和第五个是周末):

date        sales
2019-05-02  5
2019-05-03  5
2019-05-06  5
2019-05-07  10
2019-05-08  10

我想创建具有相同销售额的日期范围。但范围不应包含间隙。所以我需要的是这样的:

from_date   to_date     sales
2019-05-02  2019-05-03  5
2019-05-06  2019-05-06  5
2019-05-07  2019-05-08  10

这是我当前的查询:

SELECT * FROM (
    SELECT
       MIN(date) OVER(my_window) AS from_date,
       MAX(date) OVER(my_window) AS to_date,
       sales
    FROM sales_table
    WINDOW my_window AS (
        PARTITION BY sales
    )
) AS window_query
GROUP BY from_date, to_date, sales

提供:

from_date   to_date     sales
2019-05-02  2019-05-06  5
2019-05-07  2019-05-08  10

我怎样才能做到这一点?

最佳答案

这是一个间隙和岛屿问题。您可以通过从日期中减去一系列数字来解决该问题。连续的日期将具有相同的日期:

SELECT MIN(date), MAX(date), sales
FROM (SELECT s.*,
             ROW_NUMBER() OVER (PARTITION BY sales ORDER BY date) as seqnum
       FROM sales_table s
      ) s
GROUP BY sales, date - interval seqnum day;

关于mysql - 如何排除使用 mysql 窗口函数创建的日期范围中的间隙?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56077823/

相关文章:

mysql - 如何加入mysql

MySQL:如何选择非零的最小整数

php - 如何在查询运行之前删除查询中的字符

mysql - 根据行中的数据创建多列

mysql - 如何插入子查询作为返回多行的列值?

php - 将数组插入 mysql 表(结果仅为零)

mysql - sql查询以获取组的最大日期

sql - 每次更新数据库时都需要发出 CREATE INDEX 吗?

c# - 有没有更好的方法来获取表结构?

java - 如何在表中没有索引且无需重新部署项目的情况下加速 sql 查询