2014-09-04 31 views
0

我有一個3字段的表。即從上一行/下一行獲取值SQL

id, transferdate, placeid 
--------------------------- 
1 | 1-4-2014 | 14 
2 | 4-4-2014 | 14 
5 | 10-4-2014| 14 
6 | 1-5-2013 | 13 
9 | 10-6-2013| 12 

我想達成什麼......如果可能的話......有一個單一的查詢(無論有多少子查詢),而純SQL(沒有支點,CTE等)是獲得相同的: placeid的每行的轉移日期, 上一行或下一行 ,以便我可以對它們進行一些計算。 我的意思是:

id, transferdate, placeid, nexttransferdate 
    -------------------------------------------- 
    1 | 1-4-2014 | 14  | 4-4-2014   
    2 | 4-4-2014 | 14  | 10-4-2014 
    5 | 10-4-2014| 14  | null (or transferdate) 
    6 | 1-5-2013 | 13  | null (or transferdate) 
    9 | 10-6-2013| 12  | null (or transferdate) 

我曾與在存儲過程或函數,甚至遊標使用臨時表來實現它,我知道如何與內置的遞歸功能(即甲骨文)這樣做,但我的問題是,我需要將它用作報表SQL語句中的子查詢,因此它必須是普通的SQL代碼作爲一個語句。

謝謝您的回答

+0

請不要使用不適用於您的問題的標籤。 – 2014-09-04 13:58:40

+0

所以它不一定是不可知的?你標記是這樣的,但你的解釋說它是在SQL服務器。假設它是SQL服務器你運行的是哪個版本?你可以在報告中使用cte。 – 2014-09-04 14:03:41

+0

@SeanLange:自從OP提到它幾次以來,我已將它標記爲「與數據庫無關」。你不知道他指的是哪一種_report_。 – 2014-09-04 14:06:29

回答

2

SQL標準功能尋找到以前的行是LAG和尋找到後來行是鉛。但它們在每個dbms中都不可用。只需查看它們是否可用。

如果不是:下一個值始終是所有較大值的最小值,前一個值是所有較小值的最大值。這應該可以幫助你建立一個查詢。

編輯:這裏是不含鉛的簡單查詢你:

select 
    id, 
    transferdate, 
    placeid, 
    (
    select min(transferdate) 
    from transfers latertransfers 
    where latertransfers.placeid = transfers.placeid 
    and latertransfers.transferdate > transfers.transferdate 
) as nexttransferdate 
from transfers 
order by id; 

編輯:這裏是LEAD版本。自Oracle 8.1.6版起可用。

select 
    id, 
    transferdate, 
    placeid, 
    lead(transferdate) over (partition by placeid order by transferdate) as nexttransferdate 
from transfers 
order by id; 
+0

謝謝你的回答。它的功能與[link](@GordonLinoff)相同,但查詢計劃顯示您的運行速度更快。 – ckinfos 2014-09-04 14:31:31

+0

我也添加了LEAD查詢。這是做到這一點的直接方式,應該導致最佳的執行計劃。 – 2014-09-04 14:35:31

1

你可以做到這一點自聯接和聚集:

select t.id, t.transferdate, t.placeid, min(t.transferdate) 
from table t left join 
    table tnext 
    on tnext.placeid = t.placeid and tnext.transferdate > t.transferdate 
group by t.id, t.transferdate, t.placeid; 

這麼說,我不會真的建議使用此查詢。在幾乎每個數據庫中,都有更好的方法。

+0

它適用於我需要的功能,但它肯定會按照你提到的做一個奇怪的查詢計劃。我必須回答kettner的查詢。無論如何,謝謝你們。 – ckinfos 2014-09-04 14:37:00