我有2张桌子: 表1
Column A Column B Time
R T 11/3/14 8:30:00
A T 11/3/14 8:35:00
表2
Column A Column B Time2
S T 11/3/14 8:30:00
U T 11/3/14 8:32:00
如果表2中有一行介于两者之间,我必须编写一个SQL查询来检查表1中的每个连续行对。因此,在这种情况下,表2中的第2行发生在8:32,因此它落在表1的前2行之间。 我从早上起就一直在努力解决这个问题,有许多答案显示如何比较同一个表的连续行,但我不知道如何将它们与第二个表进行比较。
所需的输出是表2的第2行: U T 11/3/14 8:32:00
有人可以帮忙吗?
答案 0 :(得分:0)
如果您使用的是sql server,那么对于此数据集:
DECLARE @Table1 TABLE (A VARCHAR(10), B VARCHAR(10), Time1 Datetime)
DECLARE @Table2 TABLE (A VARCHAR(10), B VARCHAR(10), Time2 Datetime)
INSERT @Table1 VALUES
('R', 'T', '11/3/14 8:30:00'),
('A', 'T', '11/3/14 8:32:00'),
('R', 'T', '11/3/14 8:40:00'),
('A', 'T', '11/3/14 8:42:00')
INSERT @Table2 VALUES
('S', 'T', '11/3/14 8:30:00'),
('U', 'T', '11/3/14 8:32:00')
您可以通过使用交叉申请
获得一个表格,您可以用它来比较@ Table2SELECT t1.Time1 AS R_time, t.Time1 AS A_time
FROM @Table1 AS t1
CROSS APPLY
(
SELECT TOP 1 t2.Time1
FROM @Table1 AS t2
WHERE A = 'A' AND t2.Time1 >= t1.Time1
) AS t
WHERE A = 'R'
以上给出了输出:
R_time A_time
-----------------------------------------------
2014-11-03 08:30:00.000 2014-11-03 08:32:00.000
2014-11-03 08:40:00.000 2014-11-03 08:42:00.000
因此,最终查询如下所示:
SELECT *
FROM @Table2 As t3
CROSS APPLY (
SELECT t1.Time1 AS R_time, t.Time1 AS A_time
FROM @Table1 AS t1
CROSS APPLY
(
SELECT TOP 1 t2.Time1
FROM @Table1 AS t2
WHERE A = 'A' AND t2.Time1 >= t1.Time1
) AS t
WHERE A = 'R'
) t4
WHERE t3.Time2 BETWEEN t4.R_time AND t4.A_time
输出:
A B Time2 R_time A_time
-------------------------------------------------------------------------------
S T 2014-11-03 08:30:00.000 2014-11-03 08:30:00.000 2014-11-03 08:32:00.000
U T 2014-11-03 08:32:00.000 2014-11-03 08:30:00.000 2014-11-03 08:32:00.000
答案 1 :(得分:0)
步骤1:联合两个表(我假设结构相同)并按时排序。此外,添加一个字段,告诉您记录来自哪个表(例如,对于table1表示0,表2表示1) 步骤2:找出此联合结果集中属于table2的所有记录,并具有table2中的上一个和下一个记录。
如果您需要查询,请告诉我。