我有一个表格,根据日期列出了工作状态。
例如:
日期从 | 日期 | 状态 |
---|---|---|
2023-01-01 | 2023-01-02 | 进行中 |
2023-01-02 | 2023-01-03 | 进行中 |
2023-01-03 | 2023-01-04 | 没有电 |
2023-01-04 | 2023-01-05 | 进行中 |
我想将该表总结如下:
日期从 | 日期 | 状态 |
---|---|---|
2023-01-01 | 2023-01-03 | 进行中 |
2023-01-03 | 2023-01-04 | 没有电 |
2023-01-04 | 2023-01-05 | 进行中 |
我尝试在列上使用最大值/最小值,但我得到的结果如下:
日期从 | 日期 | 状态 |
---|---|---|
2023-01-01 | 2023-01-05 | 进行中 |
2023-01-03 | 2023-01-04 | 没有电 |
这是不正确的。
有人知道如何编写查询来获取结果吗?
这是变相的差距和孤岛问题。 我们可以在这里尝试使用行数差异法:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (ORDER BY date_from) rn1,
ROW_NUMBER() OVER (PARTITION BY Status ORDER BY date_from) rn2
FROM yourTable
)
SELECT
MIN(date_from) AS date_from,
MAX(date_to) AS date_to,
Status
FROM cte
GROUP BY
Status,
(rn1 - rn2);