简体   繁体   English

MS SQL服务器延迟

[英]MS SQL SERVER LAG

在此处输入图片说明

I'm trying to apply a condition to LAG in a SQL query. 我正在尝试在SQL查询中将条件应用于LAG Does anyone know how to do this? 有谁知道如何做到这一点?

This is the query: 这是查询:

  SELECT CONCAT([FirstName],' ',[LastName]) AS employee,
         CAST([ArrivalTime] AS DATE) AS date,
         CAST(DATEADD(hour,2,FORMAT([ArrivalTime],'HH:mm')) AS TIME) as time,
         CASE [EventType]
         WHEN 20001 THEN 'ENTRY'
         ELSE 'EXIT'
         END AS Action,
         OutTime = 
  CASE [EventType]
  WHEN '20001'
  THEN DATEDIFF(minute,Lag([ArrivalTime],1) OVER(ORDER BY [CardHolderID], [ArrivalTime]), [ArrivalTime]) 
  ELSE
  NULL
  END
  FROM [CCFTEvent].[dbo].[ReportEvent]
  LEFT JOIN [CCFTCentral].[dbo].[Cardholder] ON  [CCFTEvent].[dbo].[ReportEvent].[CardholderID] = [CCFTCentral].[dbo].[Cardholder].[FTItemID]
  WHERE EventClass = 41
  AND [FirstName] IS NOT NULL
  AND [FirstName] LIKE 'Leeann%'

The problem I have is when the times are subtracted between two different dates, it must also be NULL when subtracting between two different dates. 我的问题是两个不同日期之间的时间相减时,两个不同日期之间的时间相减时也必须为NULL

在此处输入图片说明

The 910 is incorrect. 910不正确。

I'd add another condition to your case statement. 我会在您的case陈述中添加另一个条件。 ie

...
CASE 
   WHEN [EventType] = '20001' AND DATEDIFF(DAY,[ArrivalTime],LAG([ArrivalTime]) over (ORDER BY [CardHolderID], [ArrivalTime])) > 0
   THEN NULL
   WHEN [EventType] = '20001'
   THEN DATEDIFF(minute,Lag([ArrivalTime],1) OVER(ORDER BY [CardHolderID], [ArrivalTime]), [ArrivalTime])
   ELSE NULL

It seems to me that the LAG just needs to be partitioned by the date (& some other fields for good measure). 在我看来,LAG仅需要按日期进行分区(以及其他一些可以很好度量的字段)。

If the previous date is in another partition, 如果以前的日期在另一个分区中,
then the LAG will return NULL, 那么LAG将返回NULL,
then the datediff will return NULL. 那么datediff将返回NULL。

SELECT 
 CONCAT(holder.FirstName+' ', holder.LastName) AS employee,
 CAST(repev.ArrivalTime AS DATE) AS [date],
 CAST(SWITCHOFFSET(repev.ArrivalTime,'+02:00') AS TIME)  as [time],
 IIF(repev.EventType = 20001, 'ENTRY', 'EXIT') AS Action,
 (CASE WHEN repev.EventType = 20001
  THEN DATEDIFF(minute, LAG(repev.ArrivalTime) 
                        OVER (PARTITION BY repev.EventClass, repev.CardholderID, CAST(repev.ArrivalTime AS DATE) 
                              ORDER BY repev.ArrivalTime), repev.ArrivalTime)
  END) AS OutTime
FROM [CCFTEvent].[dbo].[ReportEvent] AS repev
LEFT JOIN [CCFTCentral].[dbo].[Cardholder] AS holder ON holder.FTItemID = repev.CardholderID
WHERE repev.EventClass = 41
  AND holder.FirstName LIKE 'Leeann%'

Test on db<>fiddle here DB <>小提琴测试这里

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM