取消
顯示的結果
而不是尋找
你的意思是:

SQL查詢領先和滯後

ejloh
新的貢獻者二世

我想創建一個新的列,填寫下麵的null。我試著使用領先和拖後但並不是正確的。基本上試圖找出是誰“擁有”的記錄,鑒於TransferFrom TransferTo列和事件序列。例如,35的記錄直到他們把57。我現在查詢隻會填充35記錄2,因為它隻會由一個記錄。我需要查詢填充所有記錄在此之前如果35 TransferFrom中發現的第一個值列。什麼好主意嗎?(順便說一句,我也試圖利用外部應用在SQL Server工作但不是由火花SQL)

創建表的腳本:

創建表的結果(OrderID int, TransferFrom字符串,TransferTo字符串,ActionTime時間戳)插入結果值(1空,空,2020-01-01就是),(1,空,空,2020-01-02就是),(1,空,空,2020-01-03就是),(1,“35”,“57”,“2020-01-04就是”),(1,空,空,2020-01-05就是),(1,空,空,2020-01-06就是),(1,“57”,“45”、“2020-01-07就是”),(1,空,空,2020-01-08就是),(1,空,空,2020-01-09就是),(1,空,空,2020-01-10就是)

目前查詢不工作:

SELECT *,合並(鉛(TransferFrom) /(分區由ActionTime OrderID秩序),TransferFrom,滯後(TransferTo) /(分區通過OrderID秩序ActionTime)) NewColumn從結果

當前查詢結果是不正確的:

圖像

所需的查詢結果:

圖像

3回複3

ejloh
新的貢獻者二世

這可能是次優的火花SQL,但是它讓我正確的答案。

從結果)與cte1 (select *, cte2作為(select * from cte1 TransferFrom不是null或TransferTo不是由ActionTime零訂單),cte3作為(選擇不同的OrderID TransferFrom從cte2聯盟選擇不同的OrderID團隊,TransferTo從cte2團隊),cte4(選擇一個。*,ifnull (timestampadd(微秒,1 c.ActionTime), 2000 - 01 - 01 - t00:00:00.000 + 0000”)作為開始時間,ifnull (b.ActionTime,“9999 - 12 - 31 t00:00:00.000 + 0000”)從cte3 EndTime作為左加入cte2 b上。OrderID = b。OrderID和。團隊= b。TransferFrom離開加入cte2 c上。OrderID = c。OrderID和。團隊= c。TransferTo order by OrderID、開始時間),cte5(選擇一個。*,b。團隊從cte1加入cte4 b上。OrderID = b。OrderID和。ActionTime b之間。開始時間和b。EndTime) select * from cte5訂單1,4

Hubert_Dudek1
尊敬的貢獻者三世

請替換了

忽略null /

Vidula
尊敬的貢獻者

你好@Eric Lohbeck

@Hubert Dudek反應回答你的問題嗎?如果是的,你會很高興它標記為最好,其他成員可以找到解決方案更快嗎?

我們很想聽到你的聲音。

謝謝!

歡迎來到磚社區:讓學習、網絡和一起慶祝

加入我們的快速增長的數據專業人員和專家的80 k +社區成員,準備發現,幫助和合作而做出有意義的聯係。

點擊在這裏注冊今天,加入!

參與令人興奮的技術討論,加入一個組與你的同事和滿足我們的成員。

Baidu
map