2017-07-21 9 views
0

私は今このような表になっています。各行は、行を横切って複製することができる時間(テーブルを昇順にソートされた)値、2つの値があります指定された行の特定の値を持つ次の行を見つけよう

Key  TimeCall  R_ID  S_ID 
------------------------------------------- 
1   100   40  A 
2   101   50  B 
3   102   40  C 
4   103   50  D 
5   104   60  A 
6   105   40  B 

私は、行ごとに、前記のようなものを返すように希望をJOINは、その行のR_IDを共有する次の行のS_IDTime_Callが表示されるように適用されます(または、その行が指定されたR_IDの最後のインスタンスの場合はNULLです)。例:

Key  TimeCall  R_ID  S_ID  NextTimeCall  NextS_ID 
---------------------------------------------------------------------- 
1   100   40  A   102    C 
2   101   50  B   103    D 
3   102   40  C   105    B 
4   103   50  D   NULL    NULL 
5   104   60  A   NULL    NULL 
6   105   40  B   NULL    NULL 

これを行う方法についてのアドバイスは非常に高く評価されます。今、私は自分自身に、テーブルに参加し、私が参加していた上のキーをずらすが、私はこれは私が上に概説してきた場合は動作しません知っているよ。だから、誰もができれば

SELECT TOP 10 Table.*, Table2.TimeCall AS NextTimeCall, Table2.S_ID AS NextS_ID 
    FROM tempdb..#Table AS Table 
     INNER JOIN tempdb..#Table AS Table2 
     ON Table.TimeCall + 1 = Table2.TimeCall 

連続した行ではなく、多くの義務づけられた行を呼び出すことができるように、これを行う方法を私に教えてください!

答えて

1

使用LEAD()機能:

SELECT * 
, LEAD(TimeCall) OVER (PARTITiON BY R_ID ORDER BY [Key]) AS NextTimeCall 
, LEAD(S_ID) OVER (PARTITiON BY R_ID ORDER BY [Key]) AS NextS_ID 
FROM Table2 
ORDER BY [Key] 

SQLFiddle DEMO

+0

恐ろしいです。これは私が探していると思われるので、質問出力を見直してみましょう。今はありがたくありがとう! – tmck8

0

この私が近くに持っていた...しかし、私はそれはあなたを助けることができると思い、ちょうどあなたのケースに適合させるだけの試験例であり、それはラグを使用し、鉛...そして、それはSQL Serverの

if object_id('tempdb..#Test') IS NOT NULL drop table #Test 
create table #Test (id int, value int) 

insert into #Test (id, value) 
values 
(1, 1), 
(1, 2), 
(1, 3) 

select id, 
    value, 
    lag(value, 1, 0) over (order by id) as [PreviusValue], 
    lead(Value, 1, 0) over (order by id) as [NextValue] 
from #Test 
です

結果はただ実際のNAMにテーブル名を変更

を最初のクエリと同じR_IDを持ち、高いキーフィールドを持つトップ1の値を選択するには、Apply OUTERを使用し

id value PreviusValue NextValue 
1  1   0    2 
1  2   1    3 
1  3   2    0 
0

ですクエリの両方の部分にあなたのテーブルのeがあります

SELECT a.*, b.TimeCall as NextTimeCall, b.S_ID as NextS_ID FROM 
    (
    SELECT * FROM TableName as a 
    ) as a 
    OUTER APPLY 
    (
    SELECT TOP 1 FROM TableName as b 
    WHERE a.R_ID = b.R_ID 
    AND a.Key > B.Key 
    ORDER BY Key ASC 
    ) as b 

これは役に立ちます。 :)古いバージョンの

0

は、ここで使用して1つのトリックがあるOuter Apply

SELECT a.*, 
     nexttimecall, 
     nexts_id 
FROM table1 a 
     OUTER apply (SELECT TOP 1 timecall,s_id 
        FROM table1 b 
        WHERE a.r_id = b.r_id 
          AND a.[key] < b.[key] 
        ORDER BY [key] ASC) oa (nexttimecall, nexts_id) 

注:コラムとして予約キーワード(Key)を避けるために優れている /テーブル名。

関連する問題