我有一个结果集,看起来像这样:
客户 | 标志 | date_from | date_to|
---|---|---|---|
ABC123 | |||
ABC123 | N | 2021年2月22日 | 2021年3月31日|
ABC123 | Y | 2021年4月1日 | 2021年9月30日|
ABC123 | Y | 2021年10月1日 | 2022年3月31日|
ABC123 | Y | 2022年4月1日 | 2022年9月30日|
ABC123 | Y | 2022年10月1日 | 9999年1月1日
这是一个缺口和孤岛问题。一种方法使用行数差法:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY customer ORDER BY date_from) rn1,
ROW_NUMBER() OVER (PARTITION BY customer, flag ORDER BY date_from) rn2
FROM yourTable
)
SELECT
customer,
flag,
MIN(date_from) AS date_from,
MAX(date_to) AS date_to
FROM cte
GROUP BY
customer,
flag,
rn1 - rn2
ORDER BY
MIN(date_from);