我即将创建我认为将在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日开始工作。
我需要构建一个查询,在那里我可以及时选择日期并报告当时的工作人员。上表仅列出了名称,但会有更多列报告某个时间点。
构建表以便能够实现此查询的最佳方法是什么。
答案 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())