【问题标题】:LEAD and LAG in SQL ServerSQL Server 中的 LEAD 和 LAG
【发布时间】:2018-12-12 08:30:45
【问题描述】:

我正在尝试确定是否在保存工单后应用了模板。 代码确实运行了,但它没有从 ACTION 列中捕获字符串“已应用模板”。

这是我获取数据的表格:

这是我得到的结果:

我的代码:

SELECT *
FROM
    (SELECT              
         [ACTION], 
         CASE
            WHEN ACTION = 'Save' AND LAG(ACTION) OVER (ORDER BY SYS_CREATED_BY, SYS_CREATED_ON) LIKE 'Template Applied%' AND LAG(SYS_CREATED_BY) OVER (ORDER BY SYS_CREATED_BY, SYS_CREATED_ON) = SYS_CREATED_BY 
               THEN 1 
               ELSE 0 
         END AS RELEVANT_SAVE, 
         [TICKET_NUMBER], 
         [USER_ID], 
         [SYS_CREATED_BY], [SYS_CREATED_ON], 
         DATEPART(YEAR, [SYS_CREATED_ON]) AS YEAR, 
         DATEPART(MONTH, [SYS_CREATED_ON]) AS month
     FROM            
         TICKETSDB
     WHERE        
         (ACTION = 'Save' OR ACTION LIKE 'Template Applied%')) AS T

【问题讨论】:

  • 那么预期的结果是什么?您的结果显示两列,但您返回 8。什么给出了?
  • 哦,屏幕截图上没有显示所有其他列。当它在 ACTION 列中“应用模板”时,我想要的结果在 RELEVANT_SAVE 列下有“1”。
  • 您确定要按顺序创建吗?似乎不对。如果您尝试按人分组,请添加由 a 分区语句创建的。你能详细说明一下吗
  • 我想要捕捉的是,如果“那个人”在票证中使用了模板,那么最终在我的 Excel 报告中计算该人对他的所有票证使用模板的次数。所以在 SQL 中我还没有尝试对它进行分组。

标签: sql sql-server window-functions


【解决方案1】:

您似乎需要将order by 的一部分移动到partition by

leadlag 语句中,将over 子句更改为

OVER (PARTITION BY SYS_CREATED_BY ORDER BY SYS_CREATED_ON DESC) 

这将修复您希望按人查看的位置。

如果你不关心,或者完全删除它

 OVER ( ORDER BY SYS_CREATED_ON) 

【讨论】:

  • 代码确实运行了,但在 ACTION cokumn 下有一行“已应用模板”,它返回“0”而不是“1”。
  • 将顺序更改为 DESC 并查看是否可以解决问题。我编辑了我的答案@Jonathan
猜你喜欢
  • 1970-01-01
  • 2019-07-08
  • 2016-01-21
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多