我有一张桌子(time_period)
该表列出了几个时间段。
unique_id type_id sequence_number billing_id ...
13 LJK1 1 4356
14 CNS3 2 4356
15 LJK1 3 4356
16 AOX4 4 4356
17 CNS3 1 9827
18 POD2 2 9827
这很棘手。我需要根据递增的序列号将所有type_id对从一个句点返回到下一个句点。例如,对于billing_id ='4356',我需要检索此结果集
-----------------------------------
LJK1 | CNS3 -- type_ids pair from seq 1 to seq 2
CNS3 | LJK1 -- type_ids pair from seq 2 to seq 3
LJK1 | AOX4 -- type_ids pair from seq 3 to seq 4
每个订单的sequence_numbers的计数是可变的(高达10,低至2)。我将为X个订单执行此操作。由此,我将进行进一步的处理,但获得这些配对本身令我感到困惑。我不需要结果集中的order_id或序列号。
这里需要递归CTE吗?游标也许?或者也许使用枢轴?我刚刚进行了头脑风暴和研究,但我对其中任何一个都没有太多经验,可以使用一些方向。
使用SQL Server 2008
答案 0 :(得分:6)
我认为您不需要递归CTE或游标。试试这个:
SELECT A.type_id, B.type_id
FROM time_period A
LEFT JOIN time_period B
ON A.billing_id = B.billing_id
AND A.sequence_number = B.sequence_number - 1
WHERE A.billing_id = 4356
答案 1 :(得分:4)
(即使sequence_number(s)
不是连续的也是有效的)
SELECT a.type_id, b.type_id
FROM table a
LEFT JOIN table b
ON b.billing_id = a.billing_id
AND b.sequence_number = (SELECT max(sequence_number)
FROM table
WHERE sequence_number < a.sequence_number
AND billing_id = a.billing_id)
WHERE a.billing_id = 4356
答案 2 :(得分:1)
Select lt.typeid as l_typeid, rt.typeid as r_typeid
from time_period lt inner join time_period rt on
lt.billing_id = rt.billing_id and lt.sequence_number = rt.sequence_number -1
编辑为“lt”和“rt”别名为“left”和“right”可能是保留字。
答案 3 :(得分:0)
SELECT l.billing_id, l.type_id, r.type_id
FROM time_period AS l
INNER JOIN time_period AS r
ON r.sequence_number = l.sequence_number + 1
AND r.billing_id = l.billing_id
ORDER BY l.billing_id, l.sequence_number
答案 4 :(得分:0)
select
tp.[type_id] as 'First Period',
tp1.[type_id] as 'Second Period'
from
time_period tp
join
time_period tp1
on
tp.billing_id = tp1.billing_id
where
tp.billing_id = '4356'
and
(tp.sequence_number + 1) = tp1.sequence_number
不确定获取所有信息并以编程方式配对是否更有效,但您可以通过上述方法实现原始问题。
修改:更正了我的列名称以匹配原始问题中的列名