【问题标题】: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

标签: sql sqlite subquery max greatest-n-per-group


【解决方案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:好的。我相应地更改了查询(这仍然是相同的逻辑,但在相关子句中有两列)。
    猜你喜欢
    • 2014-06-17
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2021-10-11
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    相关资源
    最近更新 更多