Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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
按1行sql查询获取不带分组的最大值_Sql_Sql Server_Group By_Max_Greatest N Per Group - Fatal编程技术网

按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