簡體   English   中英

從上一行/下一行SQL獲取值

[英]Get Value from Previous row/next row SQL

我有3個字段的表。

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的transferdate行或到下一行,以便我可以使用它們進行一些計算。 我的意思是 :

 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)

我已經使用存儲過程或函數中的游標甚至使用了臨時表來實現了它,我知道如何使用內置的遞歸函數(即Oracle)來實現它,但是我的問題是我需要在報表中將其用作子查詢SQL語句,因此它必須是純SQL代碼作為一個語句。

謝謝您的回答

查看前幾行的SQL標准函數是LAG,查看后幾行的是LEAD。 但是,並非在每個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;

編輯:這是鉛版本。 從8.1.6版開始在Oracle中可用。

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

您可以通過自連接和聚合來實現:

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;

也就是說,我不建議您實際使用此查詢。 幾乎在每個數據庫中,都有更好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM