Mysql

在 MySQL 中使用 LAG 和 GROUP BY 獲取每個 ID 的最後三個動作

  • January 27, 2021

我希望有人可以幫助解決這個查詢,我需要一個對最後一個日期的 id 進行分組的查詢,但我想要三個最後一個動作的列。

所以我嘗試按idand used分組MAX(date),並用於LAG獲取最後三個動作,但我從(PARTITION BY id ORDER BY id..).

如果我刪除這兩個LAG函式,則查詢執行。我不知道我是否在那裡遺漏了什麼。我正在使用 MySQL Workbench 8.0 CE(編輯。我可能正在使用另一個版本的 MySQL 5.7)

SELECT
   id,
   MAX(lastdate),
   LAG(Move, 2, NULL) OVER (PARTITION BY id ORDER BY id ASC) AS Move1,
   LAG(Move, 1, NULL) OVER (PARTITION BY id ORDER BY id ASC) AS Move2,
   Move AS Move3 ,
   action_ticket
FROM table 
GROUP BY id

這是我的表:

我想要得到的表格是:

非常感謝任何幫助。非常感謝

瑪麗亞·J。

編輯。非常感謝您的幫助!

WITH cte AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY `date` DESC) rn
             FROM test )
SELECT id,
      MAX(`date`) `date`,
      MAX(CASE WHEN rn = 3 THEN move END) move1,
      MAX(CASE WHEN rn = 2 THEN move END) move2,
      MAX(CASE WHEN rn = 1 THEN move END) move3,
      MAX(CASE WHEN rn = 1 THEN action_ticket END) action_ticket
FROM cte
GROUP BY id;

小提琴

免責聲明,此答案不會提供解決方案,僅指出您查詢中的一些錯誤。您的查詢有幾個問題:

SELECT
   id,
   MAX(t1.date),
   LAG(Move, 2, NULL) OVER (PARTITION BY id ORDER BY id ASC) AS Move1,
   LAG(Move, 1, NULL) OVER (PARTITION BY id ORDER BY id ASC) AS Move2,
   Move AS Move3,
   action_ticket,
FROM table t1
GROUP BY t1.id

錯誤1:action_ticket,由於沒有後繼列,您應該刪除尾隨的“,”

錯誤 2:FROM table t1 您應該使用表的名稱,而不是單詞 table

FROM test t1

錯誤 3:ID 不能是候選鍵,因為您的範例數據中有多個 id。GROUP BY 子句必須包含足夠的資訊來唯一標識每一行

SELECT
   id,
   MAX(t1.date),
   LAG(Move, 2, NULL) OVER (PARTITION BY id ORDER BY id ASC) AS Move1,
   LAG(Move, 1, NULL) OVER (PARTITION BY id ORDER BY id ASC) AS Move2,
   Move AS Move3 ,
   action_ticket
FROM test t1
GROUP BY t1.id, Move, action_ticket

現在,這顯然不符合您的查詢要求。獲得所需結果還需要幾個步驟,但結果不會像@Akina 的解決方案那樣優雅,所以我將其留在那裡。

引用自:https://dba.stackexchange.com/questions/284067