【问题标题】:Consolidate consecutive rows, maybe using SQL Lead/Lag合并连续的行,可能使用 SQL Lead/Lag
【发布时间】:2022-01-08 21:44:22
【问题描述】:

我正在尝试将包含所有更改的表格简化为仅包含案例工作者的更改。

我的初始代码是这样的:

SELECT
      id_no
    , caseworker
    , MIN(Start_Date)
    , MAX(End_Date)
FROM Table
GROUP BY
      id_no
    , caseworker

这在大多数情况下都有效,但不适用于像这种情况,即同一个案工作者出现在两个不相交的时间段内。关于如何找到“本地”最小值和最大值的任何想法?

我看不到你们是否可以看到my picture,但我的桌子是这样的:

Id_no Caseworker Start End
1 None 2014-04-10 2020-02-17
1 KUN 2020-02-17 2020-03-19
1 KUN 2020-03-19 2020-03-21
1 KUN 2020-03-21 2020-03-31
1 KJE 2020-03-31 2020-04-22
1 KUN 2020-04-22 2021-12-02

【问题讨论】:

  • Edit问题并提供minimal reproducible example,即涉及的表或其他对象的CREATE语句(粘贴文本,不要使用图像,不要链接到外部站点),INSERT 用于示例数据 (dito) 的语句以及带有表格文本格式的示例数据的所需结果。标记您正在使用的 DBMS。
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: sql window-functions


【解决方案1】:

以下应该有效。该查询标记了案例工作者更改的所有行。然后使用标记来创建组,例如在您的数据中,组将是第 (1)、(2、3、4)、(5) 和 (6) 行:

with cte1 as (
    select *, case when lag(caseworker) over (partition by id_no order by start) = caseworker then 0 else 1 end as chg
    from t
), cte2 as (
    select *, sum(chg) over (partition by id_no order by start) as grp
    from cte1
)
select id_no, caseworker, min(start), max([end])
from cte2
group by id_no, grp, caseworker
order by id_no, grp

【讨论】:

  • 非常感谢 - 这非常有效:)
  • 如果有效,请您接受答案吗?
猜你喜欢
  • 1970-01-01
  • 2018-04-14
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多