Sql查询从多个表中获取最小日期和其他详细信息

时间:2014-03-02 13:00:00

标签: sql sql-server sql-server-2008

我有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张第一行。

我如何得到这个结果。

2 个答案:

答案 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中从同一时间开始的多个范围将被计为单个范围。

An SQLfiddle to test with

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

SQL Fiddle

相关问题