我有一个查询,它返回一些对列和日期进行分组的行。我希望该查询在列中指示每个组中的哪一个具有最大的日期。
关于如何做“每组最大 n”的问题有很多,但这些问题只需要每个组中具有最大价值的行。我想要所有的行,并且只是指出哪一个是最大的。
例如,这是一个表:
ID | 代表 | 日期 |
---|---|---|
1 | 27058 | 2020-11-16 |
2 | 27058 | 2020-11-09 |
3 | 27058 | 2020-10-30 |
4 | 46029 | 2020-11-03 |
我想要以下内容:
ID | 代表 | 日期 | 最伟大的 |
---|---|---|---|
1 | 27058 | 2020-11-16 | 1 |
2 | 27058 | 2020-11-09 | 0 |
3 | 27058 | 2020-10-30 | 0 |
4 | 46029 | 2020-11-03 | 1 |
我已经尝试了一些 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;
我想避免为了获得最大的行而必须添加额外的查询。
使用窗口函数:
这需要 MySQL 8.0.02 或 MariaDB 10.2.0 才能使用窗口函数。