从两个连续行检索组合的查询

时间:2011-03-30 14:16:26

标签: sql sql-server tsql sql-server-2008

我有一张桌子(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

5 个答案:

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

不确定获取所有信息并以编程方式配对是否更有效,但您可以通过上述方法实现原始问题。

修改:更正了我的列名称以匹配原始问题中的列名