[英]SQL Server query to return difference between dates in two rows and initial status column in OUTPUT
我有兩個表, current_perf_rat and history_perf_rat
current_perf_rat
包含 PersonRatingID、FirstName、LastName、Email、CurrentStatusID 列history_perf_rat
包含 PersonRatingID、StatusID、StatusName、StatusTimestamp、isCurrent 列current_perf_rat
人員評級ID | 名 | 姓 | 電子郵件 | 當前狀態ID |
---|---|---|---|---|
123 | 許願 | 擁抱 | xyz@gmail.com | 678 |
456 | 史密斯 | 約翰 | 史密斯@xyz.com | 746 |
history_perf_rat:
人員評級ID | 狀態ID | 狀態名稱 | 狀態時間戳 | 是當前 |
---|---|---|---|---|
123 | 678 | 給出的評級 | 2021-10-01 10:00 | 是 |
123 | 746 | 草稿評級 | 2021-09-28 15:00 | N |
123 | 567 | 開始評分 | 2021-09-01 02:00 | N |
456 | 678 | 給出的評級 | 2021-08-13 22:00 | 是 |
456 | 746 | 草稿評級 | 2021-09-17 15:00 | N |
456 | 567 | 開始評分 | 2021-08-01 02:00 | N |
456 | 561 | 初始評級 | 2020-08-01 02:00 | N |
我想創建一個查詢,以了解僅在 2021 年,應用程序從所有人員評級 ID 的第一個狀態移動到下一個狀態需要多長時間。
下面的查詢為我提供了行詳細信息及其行號 -
SELECT DISTINCT
current_perf_rat.PersonRatingID,
history_perf_rat.StatusName,
CAST(history_perf_rat.StatusTimestamp AS DATE) Application_date,
ROW_NUMBER() OVER (ORDER BY history_perf_rat.StatusTimestamp ASC) rn
FROM
current_perf_rat, history_perf_rat
WHERE
current_perf_rat.PersonRatingID = history_perf_rat .PersonRatingID
--and current_perf_rat.PersonRatingID =123 -- only one rating
ORDER BY
history_perf_rat.StatusTimestamp ASC
這給了我想要使用的輸出 -
人員評級ID | 狀態名稱 | 申請日期 | 恩 |
---|---|---|---|
456 | 開始評分 | 2021-08-01 | 2 |
456 | 初始評級 | 2020-08-01 | 1 |
123 | 草稿評級 | 2021-09-28 | 2 |
123 | 開始評分 | 2021-09-01 | 1 |
預期輸出:
人員評級ID | 狀態名稱 | 花的時間 |
---|---|---|
456 | 初始評級 | 1年 |
123 | 開始評分 | 1年28天 |
如何修改這個 SQL 語句來獲取這兩個日期和初始狀態名稱之間的差異,即“Initiated Rating”和 started rating ? 有沒有辦法通過使用 LAG 或其他方法來做到這一點?
另外,如何添加條件(參數)以便我可以選擇應該執行此操作的年份?
例如,在上面 456 的結果中,上面也包含了 2020 時間戳,但我只想包含 2021。這可以動態完成嗎?
您可以使用ROW_NUMBER
僅獲取第一行,並使用LEAD
獲取第一行之后的下一個Timestamp
SELECT
h.PersonRatingID,
h.StatusName,
Time_Taken = DATEDIFF(day, StatusTimestamp, NextTime)
FROM (
SELECT *,
NextTime = LEAD(h.StatusTimestamp)
OVER (PARTITION BY h.PersonRatingID ORDER BY h.StatusTimestamp),
rn = ROW_NUMBER() OVER (PARTITION BY h.PersonRatingID ORDER BY h.StatusTimestamp)
FROM history_perf_rat h
WHERE h.StatusTimestamp >= '2021-01-01'
) h
WHERE h.rn = 1;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.