Select table 中元组的最大值

Select max for a tuple in table

我有一个 table 看起来像这样:

host, job, folder, file, mtime

文件夹名称不是唯一的,对于分布在不同主机上的作业可以相同。我需要选择文件夹,其中最大(文件的 mtime)是不同主机上所有同名文件夹中的最大值。大致我需要这样的东西:

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

table 很大,所以我试图找出最好的方法来做到这一点。谢谢

您可以使用子查询进行过滤:

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) 上的索引。

您没有指定您希望如何处理潜在的顶级关系(与相同 folderjob 相关的行,最大值为 mtime):此查询 return他们。

ROW_NUMBER() 这样的 window 函数应该提供最好的性能:

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     |