1

我正在尝试在 SQL 表中配对记录,我的表看起来类似于:

UID      DATE          TIME      MateID
---------------------------------------
1        2013-06-07    08:00     NULL
2        2013-06-07    10:00     NULL
3        2013-06-07    13:00     NULL
4        2013-06-07    17:00     NULL
5        2013-06-08    07:00     NULL
6        2013-06-08    11:00     NULL
7        2013-06-08    14:00     NULL
8        2013-06-08    18:00     NULL

我知道我可以用光标来做到这一点,但我想知道是否有一个基于集合的解决方案可以给我这个输出:

UID      DATE          TIME      MateID
---------------------------------------
1        2013-06-07    08:00     2
2        2013-06-07    10:00     1
3        2013-06-07    13:00     4
4        2013-06-07    17:00     3
5        2013-06-08    07:00     6
6        2013-06-08    11:00     5
7        2013-06-08    14:00     8
8        2013-06-08    18:00     7

UID 字段不会是连续的,记录将按 DATE 和 TIME 排序。该表将包含大约 50k 条记录

编辑:对不起,我应该更清楚一点。MateID 是上一条/下一条记录的 UID。记录是根据 DATE 分组并按 TIME ASC 排序的,所以 DATE 的第一条记录和第二条记录是成对的,DATE 的第三条记录和第四条记录也是成对的。如果您需要我解释其他任何内容,请告诉我。每个日期总是有偶数条记录。

谢谢

4

1 回答 1

1

您可以使用ROW_NUMBER()和一些简单的数学来生成PairIDs:

declare @Tab table (UID int not null,Date date not null,time time not null)
insert into @Tab (UID,Date,Time) values
(1,'20130607','08:00'),
(2,'20130607','10:00'),
(3,'20130607','13:00'),
(4,'20130607','17:00'),
(5,'20130608','07:00'),
(6,'20130608','11:00'),
(7,'20130608','14:00'),
(8,'20130608','18:00')

;With PairedRows as (
    select UID,Date,Time,
       (ROW_NUMBER() OVER (ORDER BY Date,Time) + 1) / 2 as PairID
    from @Tab
)
select p1.UID,p1.Date,p1.Time,p2.UID
from
    PairedRows p1
        inner join
    PairedRows p2
        on
            p1.PairID = p2.PairID and
            p1.UID != p2.UID

(我已经这样做了SELECT,但是如果这意味着永久配对,它很容易切换到一个UPDATE- 从你的问题中并不清楚)


它可能更好地将您的模型与函数匹配PARTITION BY Date并且仅ORDER BY TimeROW_NUMBER()函数中匹配 - 但在这种情况下,您已经声明每个日期都有偶数行,我们关心的是那些被分配相同PairID而不关心数字的行值,它不应该影响查询的结果。

但它可能会更好地记录您的要求。

于 2013-06-07T07:47:11.420 回答