在SQL ACCESS中使用日期句点创建时间轴查询

时间:2016-06-21 18:19:15

标签: sql ms-access

我想在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”

非常感谢你的帮助

蒂博

2 个答案:

答案 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)

当然,您必须做一些额外的逻辑来获得最高级别,具体取决于您的选择配置方式。