2011-03-30 56 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 

不知道,如果是更有效的得到它所有的信息和對編程,但你的原來的問題可以通過以上來實現。

編輯:糾正我的列名,以匹配原來的問題