我正在尝试在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字段不会连续,记录将按日期和时间排序。该表将包含大约50k记录
编辑:对不起,我应该更清楚一点。 MateID是上一个/下一个记录的UID。记录按DATE分组并按TIME ASC排序,因此DATE的第一条记录和第二条记录是成对的,DATE的第三条记录和第四条记录也是成对的。如果您需要我解释其他任何事情,请告诉我。每个日期总会有偶数个记录。
由于
答案 0 :(得分:1)
您可以使用ROW_NUMBER()
和一些简单的数学来生成PairID
s:
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
- 您的问题并不是很清楚<) / p>
它可能会更好地将您的模型与PARTITION BY Date
相匹配,ORDER BY Time
函数中只有ROW_NUMBER()
- 但因为在这种情况下您已声明每个日期都有偶数行,我们关心的是那些被分配了相同PairID
的行而不关心数值,它不应该影响查询的结果。
但它可能更好地记录您的要求。