[英]How do I return max value in a non-aggregated sql query based on another column value
我最近學習了如何使用帶有聚合查詢的ARRAY_AGG
函數返回最大值(通過聚合,我的意思是在查詢中的某個時刻存在group by
功能group by
)。 最近,我嘗試將ARRAY_AGG
函數與非聚合查詢一起使用,以返回最大值,並且它沒有按我期望的那樣工作。 所以我的問題是:如何根據另一個列輸入獲取列的最大值。
要為我的問題添加更多背景信息是這里的情況。 假設您有一個正在更新其狀態的用戶。 我想查詢一個我可以擁有的最新狀態,但同時又是他的第二個最近狀態(或他最近的更新之前的狀態)的查詢。
所以這是表格:
accountKey paymentType date Status
51135473 transaction 2016-10-16 Mini
51135473 UpdateStatus 2016-09-22 Mini
51135473 transaction 2016-12-08 Standard
51135473 transaction 2016-11-08 Standard
51135473 UpdateStatus 2016-11-08 Standard
這是我想要的結果:
accountKey paymentType date Status CurrentStatus PreviousStatus
51135473 transaction 2016-10-16 Mini Standard Mini
51135473 UpdateStatus 2016-09-22 Mini Standard Mini
51135473 transaction 2016-12-08 Standard Standard Mini
51135473 transaction 2016-11-08 Standard Standard Mini
51135473 UpdateStatus 2016-11-08 Standard Standard Mini
最后狀態只是集合中的最后一個狀態。 先前的狀態是當前的狀態。 全局想法是為每個UpdateStatus paymentType同時具有當前狀態和上一個狀態。
就像我說過的,我嘗試使用以下查詢:
SELECT
accountKey,
paymentType,
date,
status,
ARRAY_AGG(status ORDER BY date DESC LIMIT 1)[OFFSET (0)] CurrentStatus
FROM
Table
GROUP BY
accountKey,
paymentType,
receivedOn
但是,此查詢在這里毫無意義,因為我不需要對任何內容進行分組。 我在這里分組,因為否則我可以運行查詢。 我知道我必須添加Group by
功能Group by
因為我正在使用ARRAY_AGG
。 所以我的問題再次出現,即如何替換在非分組查詢中使用的ARRAY_AGG
函數。
希望所有這些都有意義。
謝謝。
您可以使用nth_value()
:
select t.*,
nth_value(status, 1) over (partition by accountkey order by date desc) as current_status,
nth_value(status, 2) over (partition by accountkey order by date desc) as current_status_but_one
from t;
如果您只是想要當前狀態,我建議first_value()
。 但是您正在尋找多種狀態,因此您最好對所有狀態使用相同的功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.