MS SQL SERVER LAG - PullRequest
       20

MS SQL SERVER LAG

0 голосов
/ 28 декабря 2018

enter image description here

Я пытаюсь применить условие к LAG в запросе SQL.Кто-нибудь знает как это сделать?

Это запрос:

  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%'

У меня проблема в том, что когда время вычитается между двумя разными датами, оно также должно быть NULL при вычитании между двумя разными датами.

enter image description here

910 неверно.

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Мне кажется, что LAG нужно просто разделить по дате (и некоторым другим полям для правильной оценки).

Если предыдущая дата находится в другом разделе,
, тогда LAG будетвернуть NULL,
, тогда дата будет возвращать 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%'

Тест на db <> fiddle здесь

0 голосов
/ 28 декабря 2018

Я бы добавил еще одно условие к вашему case заявлению.то есть

...
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
...