报告某个时间点

时间:2016-12-02 04:32:36

标签: sql

我即将创建我认为将在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     -

在上述情况下,您可以看到Joel从2016年1月1日至2016年1月4日工作,休假3个月,然后从2016年1月7日开始工作。

我需要构建一个查询,在那里我可以及时选择日期并报告当时的工作人员。上表仅列出了名称,但会有更多列报告某个时间点。

构建表以便能够实现此查询的最佳方法是什么。

1 个答案:

答案 0 :(得分:0)

我昨晚开始写这篇文章,最后又回来了。基本上,您必须使用更改表来创建缓慢变化的维度,然后生成行号以匹配您的开始和结束。但是,假设您的数据库永远不会通过连续添加2个开始记录或2个结束记录而不同步。

这也假设您正在使用支持公共表表达式和窗口函数的RDBMS,例如SQL Server,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())