[英]How to get a value from previous and next row for each row in BigQuery?
[英]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.