簡體   English   中英

如何基於另一個列值在非聚合的SQL查詢中返回最大值

[英]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.

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