2011-03-30 50 views
3

我有一个表(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

+2

为什么你需要对在SQL响应,而不是列出升序排列的typeid的,并在显示器编程配对呢? – roberttdev 2011-03-30 14:21:20

+0

@roberttdev:好主意 – RollingBoy 2011-03-30 14:23:27

+1

是sequence_numbers ... sequential? – LesterDove 2011-03-30 14:27:42

回答

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 
+0

谢谢!我可以看到为什么现在可以工作。刚刚测试过这个,它是完全正确的。谢谢大家。 – James 2011-03-30 14:41:05

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” 的别名为 “左” 和 “右” 可以保留字。

+0

我可能会使用+1,但这是一种风格。 – Bill 2011-03-30 14:28:02

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

不知道,如果是更有效的得到它所有的信息和对编程,但你的原来的问题可以通过以上来实现。

编辑:纠正我的列名,以匹配原来的问题