【问题标题】:Use a partition function to get desired result使用分区函数来获得所需的结果
【发布时间】:2021-12-28 19:08:13
【问题描述】:

我有一个查询会输出以下结果集

基本上,它是员工在特定日期所处的状态以及他们的状态的结果集。我需要的是一种方法来获取员工切换状态或从非活动更改为活动的行。我在图片中突出显示了我需要的行。我可以使用复杂的连接得到结果,但我想看看是否可以使用一些分区函数。

非常感谢任何帮助。

【问题讨论】:

  • 喜欢CASE WHEN LAG(STATE) OVER (PARTITION BY <useridcolumn> ORDER BY EFFDT) <> STATE THEN 'State was changed' END AS state_change(例如)。
  • 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: sql sql-server tsql window-functions


【解决方案1】:

使用窗口滞后来获取前一行的列值并按日期排序

with cte
as
(
    select
    date,
    value,
    coalesce(
    lag(value) over (order by date asc),
    1) as last_value
    from my_table
    order by date asc
)

select * from cte where value <> last_value

【讨论】:

  • 给出明确的默认值lag(value, 1, 1) 可能比使用coalesce 更好
猜你喜欢
  • 1970-01-01
  • 2016-08-02
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
相关资源
最近更新 更多