【问题标题】:SQL compares the value of 2 columns and select the column with max value row-by-rowSQL比较2列的值并逐行选择具有最大值的列
【发布时间】:2021-02-25 09:49:00
【问题描述】:

我有类似的表:

GROUP NAME Value_1 Value_2
1 ABC 0 0
1 DEF 4 4
50 XYZ 6 6
50 QWE 6 7
100 XYZ 26 2
100 QWE 26 2

我想做的是按组分组并选择具有最高值的名称_1。如果它们的 value_1 相同,则与 value_2 比较并选择最大值。如果它们仍然相同,请选择第一个。 输出将类似于:

GROUP NAME Value_1 Value_2
1 DEF 4 4
50 QWE 6 7
100 XYZ 26 2

对我来说,这里的挑战是我不知道 NAME 中有多少个类别,所以一个简单的情况下不起作用。感谢帮助

【问题讨论】:

  • 请将您的示例数据格式化为表格,以便其可读,即第一行是列标题,后续行是数据
  • 嗨,你不需要在那里使用用例。您最有可能使用一些窗口函数,也许还有一些 CTE。如果您提供您使用的数据库以及dba.stackexchange.com/help/minimal-reproducible-example 中的一些脚本,那么建议一些东西会更容易
  • 你的意思是“如果它们仍然相同,请选择第一个。”?
  • 关系表没有记录顺序的概念——因此每次运行查询时“选择第一个”可能会返回不同的值。如果要返回特定值,则需要定义识别该值的逻辑,例如最低值、最高值等
  • 谢谢,我去看看。实际上我只是学习 SQL,所以这里超级新。选择第一个意味着如果两个名称之间的 value_1 和 value_2 都相等,则选择第一行。您在示例 XYZ 中看到,组 100 中的 QWR 相同,因此选择了 XYZ。

标签: sql


【解决方案1】:

您可以使用窗口函数来解决大部分问题:

select t.*
from (select t.*,
             row_number() over (partition by group order by value1 desc, value2 desc) as seqnum
      from t
     ) t
where seqnum = 1;

需要注意的是条件:

如果它们仍然相同,请选择第一个。

SQL 表代表无序(多)集合。除非列指定排序,否则没有“第一个”。您可以做的最好的事情是在所有其他值都相同时选择任意值。

也就是说,您可能有另一列具有排序。如果是这样,请将其作为第三个键添加到 order by

【讨论】:

  • 帮助很大。非常感谢。
猜你喜欢
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
相关资源
最近更新 更多