为表中的元组选择最大值
Posted
技术标签:
【中文标题】为表中的元组选择最大值【英文标题】:Select max for a tuple in table 【发布时间】:2020-11-14 15:07:21 【问题描述】:我有一张如下所示的表格:
host, job, folder, file, mtime
文件夹名称不是唯一的,对于分布在不同主机上的作业可以相同。我需要选择 max(mtime for a file) 是跨不同主机的所有同名文件夹中的最大值的文件夹。大概我需要这样的东西:
Select (host, folder) pair where tuple (host, job, folder) max(max (file mtime))
示例:
1, j1, f1, e1, 2
2, j1, f1, e2, 0
2, j1, f1, e9, 3
3, j1, f1, e3, 2
1, j2, f2, e4, 3
2, j2, f2, e5, 4
3, j2, f2, e6, 5
1, j3, f3, e7, 6
2, j3, f3, e8, 7
结果是:
2, j1, f1, e9, 3
3, j2, f2, e6, 5
2, j3, f3, e8, 7
桌子很大,所以我试图找出最好的方法来做到这一点。谢谢
【问题讨论】:
mysql 还是 SQLite ?请仅标记您正在使用的一个数据库。 其实是Sqlite。为多个标签道歉。 @GMB 【参考方案1】:像ROW_NUMBER()
这样的窗口函数应该提供最佳性能:
SELECT host, job, folder, file, mtime
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY folder, job ORDER BY mtime DESC) rn
FROM tablename
)
WHERE rn = 1
请参阅demo。 结果:
| host | job | folder | file | mtime |
| ---- | --- | ------ | ---- | ----- |
| 2 | j1 | f1 | e9 | 3 |
| 3 | j2 | f2 | e6 | 5 |
| 2 | j3 | f3 | e8 | 7 |
【讨论】:
【参考方案2】:您可以使用子查询进行过滤:
select t.*
from mytable t
where t.mtime = (
select max(t1.mtime) from mytable t1 where t1.folder = t.folder and t1.job = t.job
)
为了提高性能,请考虑在(folder, job, mtime)
上建立索引。
您没有指定您希望如何处理潜在的顶部关系(与相同的 folder
和 job
相关的行,最大 mtime
):此查询确实返回它们。
【讨论】:
对不起,如果我的问题不清楚。我首先需要选择任何给定文件夹中文件的最大 mtime。现在对于相同的(作业,文件夹)对,我需要找到对应于 max of max mtimes 的行(之前找到。 @Maxsteel:好的。我相应地更改了查询(这仍然是相同的逻辑,但在相关子句中有两列)。以上是关于为表中的元组选择最大值的主要内容,如果未能解决你的问题,请参考以下文章