2016-06-21 105 views
0

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

从20/06/2016到23/06/2016表中的可置信的最高级别是“低”和相关的值“A”/

从23/06到25/06的,周期是由两个记录包括在内,但可用的信心最高级别为“高”,因此该值是“b”

谢谢很多为你的帮助

蒂博

+0

你有一些SQL可以显示吗? –

+0

@MattCremeens不,我没有任何东西......我不知道从哪里开始...... – tibz64

+0

如果你至少可以开始做某件事,那么你会大大增加你获得帮助的机会。 –

回答

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) 

你必须做一些额外的逻辑来获得最高水平,当然,这取决于你的选择是如何配置的。

+0

谢谢!它完美的作品! – tibz64

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" 
+0

感谢罗宾,但事实是日期重叠。这是我的查询请求的主要问题 – tibz64

+0

为了澄清,如果在同一日期范围内存在重叠的高/低置信度,此代码将正常工作。如果日期范围与另一个日期范围的某部分重叠,则不起作用。例如1/3/16 - 1/5/16和1/4/16 - 1/6/16会导致混淆。 –