配对没有Cursor的SQL记录

时间:2013-06-07 06:56:59

标签: sql-server-2008

我正在尝试在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的第三条记录和第四条记录也是成对的。如果您需要我解释其他任何事情,请告诉我。每个日期总会有偶数个记录。

由于

1 个答案:

答案 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的行而不关心数值,它不应该影响查询的结果。

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