我有一個 SQL 表staff,它在特定日期拍攝快照并添加一行每個staffID和相應的DateID.
我需要找出自下一次以來有多少員工加入DateID,又有多少員工離開。
因此,在staff下面 DateID B的示例表中,StaffID's002和003fromDateID A不在那里,所以有 'left',DateID B有staffID's 004,005,006沒有在那里,DateID所以是 'new'。
StaffID DateID
007 C
005 C
006 B
005 B
004 B
001 B
003 A
002 A
001 A
我已經推測這些結果將如何出現在下面。
DateID New Leavers
A 0 2
B 3 2
C 1 3
我現在也只有解決這個的辦法是要經過的每個DateID與DateID前左加入舊日期算起行的地方空了新的作業人員數量的舊日期和交換表一輪的畢業生。
SELECT t1.DateID, count(*) AS Total
(SELECT *
FROM staff
WHERE DateID = 'B') t1
LEFT JOIN
(SELECT *
FROM staff
WHERE DateID = 'A') t2
ON t1.StaffID = t2.StaffID
WHERE t2.StaffID is null
GROUP BY t1.DateID
這種方法對于一個更大的表來說效率非常低,希望任何人都有想法在一個腳本中完成。或者,只為新員工撰寫的腳本和只為離職人員撰寫的腳本也一樣好。
根據@Larnu 的要求,我添加了一個snapshot包含所有 DateID 的表。該staff表被過濾為僅顯示每周的 DateID。
DateID Weekly Monthly Yearly
A Y Y N
B Y N N
C Y N N
D N N N
E Y Y N
F N N Y
uj5u.com熱心網友回復:
LEAD和LAG視窗函式在這里會有所幫助。
由于DateIDs 不是連續的,因此您還需要對其進行計算LEAD/LAG,然后將其加入
SELECT
s.DateID,
[New] = COUNT(CASE WHEN s.PrevID IS NULL OR s.PrevID <> d.PrevDateID THEN 1 END),
Leavers = COUNT(CASE WHEN s.NextID IS NULL OR s.NextID <> d.NextDateID THEN 1 END)
FROM (
SELECT *,
PrevDateID = LAG(DateID) OVER (ORDER BY DateID),
NextDateID = LEAD(DateID) OVER (ORDER BY DateID)
FROM Dates d
) d
JOIN (
SELECT *,
PrevID = LAG(s.DateID) OVER (PARTITION BY StaffID ORDER BY DateID),
NextID = LEAD(s.DateID) OVER (PARTITION BY StaffID ORDER BY DateID)
FROM staff s
) s ON s.DateID = d.DateID
GROUP BY
s.DateID;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/315229.html
標籤:sql sql-server 加入 区别
上一篇:如何將資料與加權采樣連接起來?
