我有这样的数据表
价格 | 日期 | 类型 |
---|---|---|
1000 | 2021-03-13 | A |
1000 | 2021-03-14 | A |
1000 | 2021-03-15 | A |
1300 | 2021-03-16 | A |
1000 | 2021-03-17 | A |
1300 | 2021-03-18 | A |
1000 | 2021-03-19 | A |
1500 | 2021-03-20 | A |
1500 | 2021-03-21 | A |
1500 | 2021-03-22 | A |
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 |
我想查询这样的数据
价格 | 开始日期 | 结束日期 | 类型 |
---|---|---|---|
1000 | 2021-03-13 | 2021-03-15 | A |
1300 | 2021-03-16 | 2021-03-16 | A |
1000 | 2021-03-17 | 2021-03-17 | A |
1300 | 2021-03-18 | 2021-03-18 | A |
1000 | 2021-03-19 | 2021-03-19 | A |
1500 | 2021-03-20 | 2021-03-22 | A |
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)
答案 0 :(得分:2)
这是一个间隙和孤岛问题,一种简单的处理方法是使用行数差异方法。假设您使用的是 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;
答案 1 :(得分:0)
如果不使用 CTE,您可以使用以下查询:
SELECT w1.price, w1.date, w2.date, w1.type FROM
(
SELECT * FROM mytable t1
WHERE NOT EXISTS (
SELECT 1 FROM mytable t2
WHERE
t1.price = t2.price AND
t1.type = t2.type AND
DATEDIFF(t2.date, t1.date) = -1
)
) w1
INNER JOIN
(
SELECT * FROM mytable t1
WHERE NOT EXISTS (
SELECT 1 FROM mytable t2
WHERE
t1.price = t2.price AND
t1.type = t2.type AND
DATEDIFF(t2.date, t1.date) = +1
)
) w2
ON
w1.price = w2.price AND
w1.type = w2.type AND
w1.date <= w2.date AND
NOT EXISTS (
SELECT * FROM mytable t1
WHERE NOT EXISTS (
SELECT 1 FROM mytable t2
WHERE
t1.price = t2.price AND
t1.type = t2.type AND
DATEDIFF(t2.date, t1.date) = +1
)
AND
w1.price = t1.price AND
w1.type = t1.type AND
w1.date <= t1.date AND t1.date < w2.date
)
答案 2 :(得分:-1)
SELECT MIN(date) as startDate, MAX(date) as endDate, price, type
FROM prices
GROUP BY type, price
ORDER BY MIN(date) ASC
此查询可能适用于按日期升序排列数据