为表中的元组选择最大值

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

您没有指定您希望如何处理潜在的顶部关系(与相同的 folderjob 相关的行,最大 mtime):此查询确实返回它们。

【讨论】:

对不起,如果我的问题不清楚。我首先需要选择任何给定文件夹中文件的最大 mtime。现在对于相同的(作业,文件夹)对,我需要找到对应于 max of max mtimes 的行(之前找到。 @Maxsteel:好的。我相应地更改了查询(这仍然是相同的逻辑,但在相关子句中有两列)。

以上是关于为表中的元组选择最大值的主要内容,如果未能解决你的问题,请参考以下文章

Oracle过程增加字符串数据类型并将其存储为表中的列之一

从 Sqlite 表中选择行的元组并有效地对元组进行排序

从元组列表中返回具有最小 y 值的元组

如何更新存储在 ets 表中的元组中的数字?

对有符号整数内的元组进行排序

python