mysql - SQL 选择数据并按日期范围对数据进行分组

标签 mysql sql

我有这样的数据表

<表类="s-表"> <头> 价格 <日>日期 类型 <正文> 1000 2021-03-13 一个 1000 2021-03-14 一个 1000 2021-03-15 一个 1300 2021-03-16 一个 1000 2021-03-17 一个 1300 2021-03-18 一个 1000 2021-03-19 一个 1500 2021-03-20 一个 1500 2021-03-21 一个 1500 2021-03-22 一个 2000 2021-03-13 B 2000 2021-03-14 B 2000 2021-03-15 B 2000 2021-03-16 B 2000 2021-03-17 B

我想这样查询数据

<表类="s-表"> <头> 价格 开始日期 结束日期 类型 <正文> 1000 2021-03-13 2021-03-15 一个 1300 2021-03-16 2021-03-16 一个 1000 2021-03-17 2021-03-17 一个 1300 2021-03-18 2021-03-18 一个 1000 2021-03-19 2021-03-19 一个 1500 2021-03-20 2021-03-22 一个 2000 2021-03-13 2021-03-17 B

下面是我当前的 sql,但它根本不正确

SELECT MIN(date) as startDate, MAX(date) as endDate, price, type                                      
                            FROM prices 
                            GROUP BY type, price
                            ORDER BY type, MIN(date)

最佳答案

这是一个间隙和孤岛问题,处理它的一种简单方法是使用行数差异法。假设您使用的是 MySQL 8+,以下应该有效:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY type ORDER BY date) rn1,
              ROW_NUMBER() OVER (PARTITION BY type, price ORDER BY date) rn2
    FROM prices
)

SELECT price, MIN(date) AS startDate, MAX(date) AS endDate, type
FROM cte
GROUP BY price, type, rn1 - rn2
ORDER BY type, startDate;

screen capture from demo link below

Demo

关于mysql - SQL 选择数据并按日期范围对数据进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66595810/

相关文章:

mysql - 字段列表中的列 'user_id' 不明确

mysql - INNER JOIN ON 多个属性不起作用

mysql - 我想在 SQL 查询中显示总工作时间和分钟

php - 从 SQL 获取最近 24 小时的数据

mysql - 在 Centos 6.4 上安装 MySQL 5.6 的最佳方式

mysql - SQL - 如果列条目等于 NULL,则将其设置为 0?

c# - 将值从 Angular Controller 传递到 C# API

sql - 尝试使用 SQL 从多个表中删除

sql - SQL Server 中表变量可以拥有的最大记录数

mysql - 如何在不重启 MySQL 的情况下启用 MySQL 慢查询日志?