簡體   English   中英

基於 LAG 的計算分組

[英]Group by calculation based on LAG

我正在探索 SQL (MS SQL) 的一些可能性,並想知道是否有人可以就以下問題給我一些建議。

我有兩張表,一張包含人員數據,另一張包含人員的查詢數據。

當我運行以下查詢時,我得到的結果如下表所示。

SELECT Person.Id, Inquiry.Id, Inquiry.StartDate, Inquiry.EndDate, DATEDIFF(DAY, Inquiry.StartDate, Inquiry.EndDate) AS Duration, LAG(Inquiry.EndDate) OVER (PARTITION BY Person.Id ORDER BY Inquiry.StartDate) AS EndDatePreviousFile, DATEDIFF(DAY, LAG(Inquiry.EndDate) OVER (PARTITION BY Person.Id ORDER BY Inquiry.StartDate), Inquiry.StartDate) AS DateDiffStartPreviousEnd 
FROM Person INNER JOIN Inquiry ON Person.Id = Inquiry.PersonId
WHERE Person.Id = 1
ORDER BY Inquiry.StartDate

結果:

在此處輸入圖像描述

如您所見,我使用窗口函數'LAG'來獲取上一個查詢的結束日期,因此我可以計算當前記錄的開始日期和上一個記錄的結束日期之間的差值。

接下來我想對這些數據進行分組,但只有當上述差異(開始日期當前記錄和結束日期先前記錄)小於 15 天時,我才能計算分組記錄的總持續時間。

不可能按窗口函數的結果進行分組,但也許還有其他方法可以實現這一點。

基本上期望的結果是這樣的:

在此處輸入圖像描述 任何幫助將不勝感激。


編輯

從輸入表中添加樣本從輸入表中添加樣本

我自己找到了解決方案。

我確信有更好的方法來實現這一點,但我的目的已經實現:-)。

通過兩次使用 CTE 和 CASE 函數,我設法根據需要對數據進行分組。

查詢如下所示:

WITH CTE AS
(
   SELECT p.PersonId as PersonId, i.InquiryId as InquiryId, i.StartDate as StartDate, i.EndDate as EndDate, DATEDIFF(DAY, i.StartDate, i.EndDate) AS Duration, DATEDIFF(DAY, LAG(i.EndDate) OVER (PARTITION BY p.PersonId ORDER BY i.StartDate), i.StartDate) as DiffEndPrevRecStartCurrRec
   FROM Person p INNER JOIN
      Inquiry i on p.PersonId = i.PersonId
),
CTETWO AS
(
   SELECT PersonId, InquiryId, Duration, CASE WHEN DiffEndPrevRecStartCurrRec < 30 OR LEAD(DiffEndPrevRecStartCurrRec) OVER (PARTITION BY PersonId ORDER BY StartDate) < 30 THEN 'X' ELSE CONVERT(VARCHER, InquiryId) END AS Grp
   FROM CTE
)
SELECT PersonId, SUM(Duration) AS 'Total duration'
FROM CTETWO
GROUP BY PersonId, Grp
ORDER BY PersonId

這可能是@Jeff 的意思,但我當時不明白。

結果如下所示:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM