比较一个表中的行对和另一个表中的行

时间:2014-11-03 20:18:49

标签: sql database

我有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

有人可以帮忙吗?

2 个答案:

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

您可以通过使用交叉申请

获得一个表格,您可以用它来比较@ Table2
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'

以上给出了输出:

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中的上一个和下一个记录。

如果您需要查询,请告诉我。