我想在SQL Access中编写一个Query(无法选择软件......),以便从记录表中创建时间轴。 下面是一个简单的例子,以解释我想做什么。
我有一张包含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”/
从2006年6月23日到25/06年,该期限由两个记录涵盖,但最高可信度为“高”,因此值为“b”
非常感谢你的帮助
蒂博
答案 0 :(得分:0)
如果没有看到数据结构,很难提供帮助。如果您的数据中的开始/结束日期不重叠,则可能有效:
/* 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"
答案 1 :(得分:0)
可能有一种更简单的方法,您可以从基本查询开始,以获取所有必需的日期:
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)
当然,您必须做一些额外的逻辑来获得最高级别,具体取决于您的选择配置方式。