Mariadb

每組最大 n 的變化,其中需要使用指示器的整個表,而不僅僅是每組最大的行

  • March 18, 2021

我有一個查詢,它返回一些對列和日期進行分組的行。我希望該查詢在列中指示每個組中的哪一個具有最大的日期。

關於如何做“每組最大 n”的問題有很多,但這些問題只需要每個組中具有最大價值的行。我想要所有的行,並且只是指出哪一個是最大的。

例如,這是一個表:

我想要以下內容:

我已經嘗試了一些 best-n-per-group 方法來添加“最大”指標。但是由於這些嘗試都集中在唯一具有最大值的行上,因此當像“table2.date IS NULL”這樣的 where 子句的部分被刪除時,所有連接組合都會添加額外的行。

這是一個不起作用的實驗的例子。它嘗試使用每個組的最大 n 個,但註釋掉 IS NULL 行:

SELECT DISTINCT m1.usermessageid, m1.repid, m1.sender_role, m1.message, m1.datesent, m2.datesent
FROM usermessage m1
LEFT JOIN usermessage m2 ON m1.principalid = m2.principalid and m1.repid = m2.repid AND m1.datesent < m2.datesent
WHERE m1.principalid = 99831
AND m1.repid IN (21600,99214,27058,97360,92678,96184,55429,46029)
# AND m2.datesent IS NULL
ORDER BY m1.datesent desc;

我想避免為了獲得最大的行而必須添加額外的查詢。

使用視窗函式:

SELECT ROW_NUMBER() OVER (PARTITION BY repid ORDER BY date DESC) = 1 AS greatest, ...

這需要 MySQL 8.0.02 或 MariaDB 10.2.0 才能使用視窗函式。

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