我有4个表,其中包含日期列和状态列。我想比较第1个表和其余表的日期范围,并获取表的最小日期和状态。
我知道我可以通过使用CTE和联合所有表格并使用MIN()
函数获取最小日期来获得最小日期,但我希望获得日期的最小日期和状态。
例如:第一桌输出
personCount Running StatusId MinStartTime MinEndTime 3 94 1 2014-02-21 05:40:38.723 2014-02-21 07:14:36.320 4 131 1 2014-02-21 07:14:36.320 2014-02-21 10:05:26.690
第二桌输出:
personCount Running StatusId MinStartTime MinEndTime 3 104 2 2014-02-21 06:26:44.870 2014-02-21 08:10:21.830
第3桌输出:
personCount Running StatusId MinStartTime MinEndTime 3 8 4 2014-02-21 06:18:44.203 2014-02-21 06:26:44.857 1 4 4 2014-02-21 12:38:42.857 2014-02-21 12:42:07.577
第4桌输出:
personCount Running StatusId MinStartTime MinEndTime 5 7 8 2014-02-21 10:04:04.367 2014-02-21 10:11:38.983 4 9 8 2014-02-21 10:11:38.983 2014-02-21 10:20:27.063
所以我希望从第2,第3和第4表中获得MinStartTime和statusId的最小值,如果该日期在第1个表的开始和结束时间之间。
例如:对于第一张表的第一行,MinStartTime为2014-02-21 05:40:38.723
,而MinEndtime为:2014-02-21 07:14:36.320
所以我想查询第2,第3和第4表,其中第2,第3和第4表的MinstartTime应该在第一个表开始和结束时间之间。它将返回该时间的minstarttime和status。
因此,对于第一个表的第一行,我应该获得第3个表的启动时间和状态,作为最小时间。
第一张表的第二行相同,我应该得到第4张第一行。
我如何得到这个结果。
答案 0 :(得分:0)
对于缺少主键,查询将受到一些限制,但是这样的事情应该这样做;
WITH cte AS (
SELECT t1.MinStartTime t1ms, t2.MinStartTime t2ms, t2.StatusId,
ROW_NUMBER() OVER (PARTITION BY t1.MinStartTime ORDER BY t2.MinStartTime) rn
FROM table1 t1
JOIN (SELECT * FROM table2 UNION ALL SELECT * FROM table3 UNION ALL
SELECT * FROM table4) t2
ON t2.MinStartTime BETWEEN t1.MinStartTime AND t1.MinEndTime
)
SELECT t2ms MinStartTime, StatusId FROM cte WHERE rn=1;
表上的主键会使查询更好(并且更有可能性能更高),因为您可以使用该键而不是Table1的MinStartTime
进行分区。现在,Table1中从同一时间开始的多个范围将被计为单个范围。
答案 1 :(得分:0)
尝试此查询:
WITH TAB1 AS (SELECT * FROM TABLE2
UNION ALL
SELECT * FROM TABLE3
UNION ALL
SELECT * FROM TABLE4),
TAB2 AS
(SELECT * FROM TAB1 WHERE MinStartTime =
(SELECT MIN(MinStartTime) FROM TAB1))
SELECT TAB2.MinStartTime,TAB2.StatusId FROM
TABLE1 T1 INNER JOIN TAB2 ON
TAB2.MinStartTime BETWEEN T1.MinStartTime AND T1.MinEndTime;