sql从一个历史中获取新增客户和离开跟踪的客户table

sql get newly added customer and customer who left track from one historical table

我有一个 Staff_Table 包含历史数据。每天都会添加新日期的相同员工名单(每天 1200-12500 名员工,但只有少数员工可能会在今天日期新添加,或者员工可能昨天离开公司并且没有出现在今天的名单上)。

我想知道每天哪些员工不在昨天的名单上(这是新员工,昨天出现但今天没有出现,因为他们离开了公司)。我已经尝试了以下但没有快乐请帮助我的历史 table 如下所示,我需要一个脚本来仅获取 ID4 和 ID5 的行。

StaffID StaffName CensusDate    
ID1     Staff1  02/03/2021  
ID1     Staff1  03/03/2021  
ID2     Staff2  02/03/2021  
ID2     Staff2  03/03/2021  
ID3     Staff3  02/03/2021  
ID3     Staff3  03/03/2021  
ID4     Staff4  02/03/2021  left-not showing today
ID5     Staff5  03/03/2021  New staff-is newly added today
ID6     Staff6  02/03/2021  
ID6     Staff6  03/03/2021  
ID7     Staff7  02/03/2021  
ID7     Staff7  03/03/2021  

StaffID 为浮点型,id 可能只是 ID123,或 ID123-2 我有以下脚本,但我得到 'error converting data type nvarchar to float'

WITH CTE_TodaysStaff AS
(
    SELECT DISTINCT T1.StaffID
    FROM Staff_table AS T1
    WHERE T1.CensusDate = CAST(GETDATE() AS DATE)
),
CTE_NotShowingToday AS
(
    SELECT DISTINCT T1.StaffID
    FROM Staff_Table AS T1
    LEFT JOIN CTE_TodaysStaff AS T2
         ON T1.StaffID = T2.StaffID
    WHERE T1.CensusDate = CAST(DATEADD(DAY, -1, GETDATE()) AS DATE)
        AND T2.StaffID IS NULL
 ),
CTE_NewToday AS
(
    SELECT DISTINCT T1.StaffID
    FROM CTE_TodaysStaff AS T1
    LEFT JOIN Staff_table1 AS T2
        ON T1.StaffID = T2.StaffID
        AND T2.CensusDate < CAST(GETDATE() AS DATE)
    WHERE T2.StaffID IS NULL
 )

 SELECT T1.StaffID, T1.StaffNAME, T1.CensusDate, 
     CAST(CASE WHEN T2.StaffID IS NULL THEN 0 ELSE 1 END AS BIT) AS IsNotShowingToday,
     CAST(CASE WHEN T3.StaffID IS NULL THEN 0 ELSE 1 END AS BIT) AS IsNewToday
FROM Staff_table1 AS T1
LEFT JOIN CTE_NotShowingToday AS T2
    ON T1.StaffID = T2.StaffID
LEFT JOIN CTE_NewToday AS T3
    ON T1.StaffID = T3.StaffID

感谢任何帮助,谢谢

I want to know each day which staff wasn't on yesterday list(it is new staff and the staff was showing yesterday but not today because they left company)

您可以使用聚合:

select staffid,
       max(censusdate),
       (case when max(censusdate) = cast(getdate() as date) then 'New' else 'Removed' end) as which
from staff_table st
where censusdate >= dateadd(day, -1, cast(getdate() as date))
group by staffid
having count(*) = 1

这是什么逻辑?这只选择最近两天的数据。然后它按 staffid 聚合并仅选择在一个日期出现的那些。