[英]Create a Timeline Query with date periods in SQL ACCESS
我想在SQL Access中编写一个查询(无法选择该软件...),以便从记录表中创建时间轴。 下面是一个简单的示例,以解释我要做什么。
我有一张有2条记录的表。 每个记录由其ID,值,开始日期,结束日期和置信度定义。
Id | vValue | dtBegin | dtEnd | lLevel
-------------------------------------------
1 | a |20/06/2016|28/06/2016| Low
2 | b |23/06/2016|25/06/2016| High
该查询应返回一个时间轴,其中包含每个时间段内可用的最高信息级别(及其值)。 在示例中,查询结果应为:
vValue| dtBegin | dtEnd |lLevel
------------------------------------
a |20/06/2016|23/06/2016| Low
b |23/06/2016|25/06/2016| High
a |25/06/2016|28/06/2016| Low
从2016年6月20日到2016年6月23日,表中可用的最高置信度为“低”,并且相关值为“ a” /
从23/06到25/06,该期间包含两个记录,但是可用的最高置信度为“高”,因此该值为“ b”
非常感谢你的帮助
蒂博
不看数据结构就很难提供帮助。 如果开始/结束日期在您的数据中不重叠,则可能可行:
/* Finds distinct dates which only have a low record */
SELECT
vValue,dtBegin,dtEnd,'Low' AS lLevel
FROM
(
SELECT DISTINCT vValue,dtBegin,dtEnd
FROM tbl
WHERE lLevel = "Low"
EXCEPT
SELECT DISTINCT vValue,dtBegin,dtEnd
FROM tbl
WHERE lLevel = "High"
) AS X
/* Appends distinct date sets */
UNION
SELECT DISTINCT vValue,dtBegin,dtEnd,lLevel
FROM tbl
WHERE lLevel = "High"
可能有一种更简单的方法,您可以从基本查询开始以获取所有必需的日期:
SELECT dtBegin
FROM Table1
GROUP BY dtBegin
UNION
SELECT dtEnd AS dtBegin
FROM Table1
通过此查询,您可以获取不重叠的日期范围:
SELECT Timeline.dtBegin, Min(Timeline_1.dtBegin) AS dtEnd
FROM Query1 AS Timeline, Query1 AS Timeline_1
WHERE (((Timeline_1.dtBegin) > Timeline.dtBegin))
GROUP BY Timeline.dtBegin
通过此操作,您可以交叉联接回到原始表,并使用子查询获取与日期范围重叠的任何表条目的最大级别和vValue:
SELECT Query2.dtBegin, Query2.dtEnd, Table1.lLevel, Table1.vValue
FROM Query2, Table1
WHERE (((Table1.lLevel) =
(SELECT MAX(lLevel)
FROM Table1 T
WHERE T.dtBegin <=Query2.dtBegin AND
T.dtEnd >=Query2.dtEnd))) AND
((Table1.dtBegin)<=Query2.dtBegin) AND
((Table1.dtEnd)>=Query2.dtEnd)
当然,您必须做一些额外的逻辑才能获得最大级别,具体取决于您的选择的配置方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.