【问题标题】:get Max value without group by 1 row sql query获取不按 1 行 sql 查询分组的最大值
【发布时间】:2017-02-26 01:33:54
【问题描述】:

我需要帮助才能从表中获取值而不对一个字段进行分组。

桌子设计是这样的

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

有人如何帮助我。 之前非常感谢你

【问题讨论】:

  • 请标记您的 dbms。
  • 我添加了greatest-n-per-group 标签。这个问题已经在 Stack Overflow 上回答了数百次。按照标签查看解决方案。
  • @McNets i 用户 Sql server 2012
  • 你为什么接受了一个使用 group by 的答案?

标签: sql sql-server group-by max greatest-n-per-group


【解决方案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

注意:

上述两个查询都只读取表一次。接受的解决方案读取表两次。

【讨论】:

  • 我们应该使用ROW_NUMBER() 还是为此排名?我认为我们将不得不为每条记录计算row_number,所以这将成为大型数据集的一个大问题。
  • 我没有怪你,我只是想问问。在使用ROW_NUMBER VS MAX 搜索后,我得到的答案是It Depends :))。为了简单起见,不计入索引,优化...,您的查询复杂度就像for x in 1..n (for y in 1..x) 并且是 O(n* n),上面的解决方案是 MAX + IN (或 JOIN) = O(n) + O(n* n) = O(n* n) 太
  • @PhamX.Bach - 当然这取决于。有时,您会认为相关查询会更慢,但它们的性能优于不相关查询。在数据世界中,现在的快速解决方案明天可能不会那么快。
  • 是的,所以我们有 CBO :x
【解决方案2】:

你可以用这个

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
    );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    相关资源
    最近更新 更多