按1行sql查询获取不带分组的最大值
我需要帮助从表中获取值,而无需将一个字段分组 桌子的设计是这样的按1行sql查询获取不带分组的最大值,sql,sql-server,group-by,max,greatest-n-per-group,Sql,Sql Server,Group By,Max,Greatest N Per Group,我需要帮助从表中获取值,而无需将一个字段分组 桌子的设计是这样的 Progress DocNum Project --------------------------- 30 10 1111 70 11 1111 30 10 1112 100 12 1111 70 13 1112 然后我想要这样的数据。 获取每个项目的最大进度,而不分组
Progress DocNum Project
---------------------------
30 10 1111
70 11 1111
30 10 1112
100 12 1111
70 13 1112
然后我想要这样的数据。
获取每个项目的最大进度,而不分组DocNum
Progress DocNum Project
---------------------------
100 12 1111
70 13 1112
有谁能帮助我。
在此之前非常感谢您您可以使用此
SELECT t.progress, t.docnum, t.project
FROM table_name t
INNER JOIN (
SELECT MAX(progress) max_progress,
project
FROM table_name
GROUP BY project
) mt
ON t.project = mt.project
AND t.progress = mt.progress;
还是这个
SELECT progress, docnum, project
FROM table_name
WHERE (progress, project) IN (
SELECT MAX(progress) max_progress,
project
FROM table_name
GROUP BY project
);
你可以用这个
SELECT t.progress, t.docnum, t.project
FROM table_name t
INNER JOIN (
SELECT MAX(progress) max_progress,
project
FROM table_name
GROUP BY project
) mt
ON t.project = mt.project
AND t.progress = mt.progress;
还是这个
SELECT progress, docnum, project
FROM table_name
WHERE (progress, project) IN (
SELECT MAX(progress) max_progress,
project
FROM table_name
GROUP BY project
);
您可以使用窗口函数row_number获得每个项目最大进度的一行:
Select *
From (
Select t.*,
Row_number() over (partition by project order by progress desc) rn
From your_table t
) t where rn = 1
如果有多行具有每个项目的最大进度,并且您希望检索所有行,请改用秩:
Select *
From (
Select t.*,
Rank() over (partition by project order by progress desc) rnk
From your_table t
) t where rnk = 1
注:
上述两个查询只读取表一次。接受的解决方案将表格读取两次 您可以使用窗口函数row_number来获得每个项目的最大进度的一行:
Select *
From (
Select t.*,
Row_number() over (partition by project order by progress desc) rn
From your_table t
) t where rn = 1
如果有多行具有每个项目的最大进度,并且您希望检索所有行,请改用秩:
Select *
From (
Select t.*,
Rank() over (partition by project order by progress desc) rnk
From your_table t
) t where rnk = 1
注:
上述两个查询只读取表一次。接受的解决方案将表格读取两次 请标记您的dbms。我添加了标记。关于堆栈溢出,这个问题已经被回答了数百次。按照标记查看解决方案。@McNets i user Sql server 2012为什么接受使用group by的答案?请标记您的dbms。我添加了标记。关于堆栈溢出,这个问题已经被回答了数百次。按照标签查看解决方案。@McNets i user Sql server 2012为什么您接受了使用group by的答案?我们应该使用
行编号()
还是排名?我认为我们必须计算每条记录的行数,所以这将成为大数据集的一个大问题。我没有责怪你,我只是想问一下。在搜索了行数VS MAX
后,我得到的答案是这取决于它(代码>:))。简单地说,不算索引,优化…,您的查询的复杂性就像对于1..n中的x(对于1..x中的y)
和be O(n*n),上面的解决方案是MAX+in(或JOIN)=O(n)+O(n*n)=O(n*n)too@PhamX.Bach-当然要视情况而定。有时,您会认为相关查询速度较慢,但它们的性能优于不相关查询。在数据世界中,现在的快速解决方案可能不会像明天那么快。是的,所以我们有CBO:x我们应该为此使用ROW\u NUMBER()
或rank吗?我认为我们必须计算每条记录的行数,所以这将成为大数据集的一个大问题。我没有责怪你,我只是想问一下。在搜索了行数VS MAX
后,我得到的答案是这取决于它(代码>:))。简单地说,不算索引,优化…,您的查询的复杂性就像对于1..n中的x(对于1..x中的y)
和be O(n*n),上面的解决方案是MAX+in(或JOIN)=O(n)+O(n*n)=O(n*n)too@PhamX.Bach-当然要视情况而定。有时,您会认为相关查询速度较慢,但它们的性能优于不相关查询。在数据世界中,现在的快速解决方案可能不会像明天那么快。是的,所以我们有CBO:x