2016-12-02 82 views
0

我正在創建我認爲將SQL中的2個新表。這個想法是一個是「實時」數據,另一個是保持所有變化。日期爲DD/MM/YYYY格式。關於某個時間點的報告

Active 
ID | Name | State Date | End Date 
1 Zac 1/1/2016  -   
2 John 1/5/2016  -   
3 Sam 1/6/2016  -   
4 Joel 1/7/2016  -   

Changes 
CID | UID | Name | Start Date | End Date 
1  1  Zac 1/1/2016  - 
2  4  Joel 1/1/2016  - 
3  4  Joel -   1/4/2016  
4  2  John 1/5/2016  - 
5  3  Sam 1/6/2016  - 
6  4  Joel 1/7/2016  - 

在上述情況下,你可以看到,喬爾從2016年1月1日一直工作到2016年1月4日,了3個月關閉,然後從2016年1月7日的工作。

我需要建立一個查詢,我可以在那裏及時選擇一個日期並報告當時誰在工作。上表僅列出名稱,但在某個時間點上還會有更多列進行報告。

什麼是最好的方式來構建表,以便能夠實現此查詢。

+2

這裏是關於不同的漸變維度的好文章SCD類型和結構可能會根據其他用途和要求將其保存在同一張表中,從而簡化您的生活。 https://en.wikipedia.org/wiki/Slowly_changing_dimension – Matt

+0

將有一個閱讀。謝謝! – Zac

+3

您所選擇的DBMS可能對此類任務有一些內置支持。例如,SQL Server 2016實現了[Temporal tables](https://msdn.microsoft.com/en-us/library/dn935015.aspx)。 –

回答

0

我開始寫這個昨晚,最後回到它。基本上,你將不得不使用你的變化表創建一個漸變維度,然後生成一個行號來匹配你的開始和結束。但是,這將假設您的數據庫將永遠不會通過在一行中添加2個開始記錄或2個結束記錄而不同步。

這還假定您使用的是支持公共表表達式和窗口功能,如SQL服務器,Oracle,PostgreSQL的,DB2關係數據庫....

WITH cte AS (
    SELECT 
     * 
     ,ROW_NUMBER() OVER (PARTITION BY UID ORDER BY ISNULL(StartDate,EndDate)) As RowNum 
    FROM 
     Changes c 
) 

SELECT 
    s.UID 
    ,s.Name 
    ,s.StartDate 
    ,COALESCE(e.EndDate,GETDATE()) as EndDate 
FROM 
    cte s 
    LEFT JOIN cte e 
    ON s.UID = e.UID 
    AND s.RowNum + 1 = e.RowNum 
WHERE 
    s.StartDate IS NOT NULL 
    AND '2016-05-05' BETWEEN s.StartDate AND COALESCE(e.EndDate,GETDATE())