Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为表中的元组选择最大值_Sql_Sqlite_Subquery_Max_Greatest N Per Group - Fatal编程技术网

Sql 为表中的元组选择最大值

Sql 为表中的元组选择最大值,sql,sqlite,subquery,max,greatest-n-per-group,Sql,Sqlite,Subquery,Max,Greatest N Per Group,我有一张这样的桌子: host, job, folder, file, mtime Select (host, folder) pair where tuple (host, job, folder) max(max (file mtime)) 文件夹名称不是唯一的,对于分布在不同主机上的作业,文件夹名称可以相同。我需要选择最大值(文件的mtime)是不同主机上相同名称的所有文件夹的最大值的文件夹。大概我需要这样的东西: host, job, folder, file, mtime Sel

我有一张这样的桌子:

host, job, folder, file, mtime
Select (host, folder) pair where tuple (host, job, folder) max(max (file mtime))
文件夹名称不是唯一的,对于分布在不同主机上的作业,文件夹名称可以相同。我需要选择最大值(文件的mtime)是不同主机上相同名称的所有文件夹的最大值的文件夹。大概我需要这样的东西:

host, job, folder, file, 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

桌子很大,所以我想找出最好的方法。谢谢

您可以使用子查询进行筛选:

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
)

关于性能,考虑一个索引>代码>(文件夹、作业、MTIME)< /代码> ./P>


您没有指定要如何处理潜在的顶部关系(与最大
mtime
的相同
文件夹和
作业相关的行):此查询将返回它们。

您可以使用子查询进行筛选:

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
)

关于性能,考虑一个索引>代码>(文件夹、作业、MTIME)< /代码> ./P>


您没有指定要如何处理潜在的顶部关系(与最大
mtime
的相同
文件夹和
作业相关的行),此查询会返回它们。

类似
行号()的窗口函数应能提供最佳性能:

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
请参阅。
结果:


类似于
ROW\u 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
请参阅。
结果:


MySQL还是SQLite?请仅标记您正在使用的一个数据库。它实际上是Sqlite。为多个标签道歉@GMBMySQL还是SQLite?请仅标记您正在使用的一个数据库。它实际上是Sqlite。为多个标签道歉@如果我在这个问题上不清楚的话,我很抱歉。我首先需要选择任何给定文件夹中文件的最大时间。现在对于相同的(作业、文件夹)对,我需要找到与max of max mtimes(以前找到)对应的行。@Maxsteel:好的。我相应地更改了查询(这仍然是相同的逻辑,但在correlation子句中有两列)。如果我在问题中不清楚,很抱歉。我首先需要选择任何给定文件夹中文件的max mtime。现在是相同的(作业,文件夹)对,我需要找到与max of max mtimes(以前找到过)对应的行。@Maxsteel:好。我相应地更改了查询(这仍然是相同的逻辑,但在correlation子句中有两列)。