【问题标题】:SQL MAX(col1, col2) with priorities具有优先级的 SQL MAX(col1, col2)
【发布时间】:2021-11-18 10:30:24
【问题描述】:

我需要为每个组选择具有 MAX(val1) 的行。 如果有多个等于 val1 = MAX(val1) 的行,我需要从它们中选择具有 MAX(val2) 的行,等等。 在伪代码中应该是这样的:

IF row1.val1 != row2.val1
    GET MAX(val1)
ELSE
    GET MAX(val2)

例如:

我有一个表nums,其中一个TEXTname 和三个INTEGER 列-idnum1num2 填充了值:

id name num1 num2
1 Name1 10 20
2 Name1 10 30
3 Name2 08 15
4 Name2 10 20
5 Name3 20 2
6 Name3 20 1

我需要一个查询,它将返回给我:

2
4
5

可能是这样的

SELECT id FROM nums GROUP BY name HAVING MAX(num1, num2)

但是 MAX(num1, num2) 不起作用。

我在 python3.8 中使用 sqlite3 模块。

【问题讨论】:

  • 您的查询语法不正确。请发布一些示例数据和预期输出。
  • @AnkitBajpai 发布示例数据和预期输出
  • HAVING 要求您创建一个真/假语句,例如“HAVING max(val1) > 3”。由于您不知道单个 SQL 中的最大值,因此您将不得不嵌套两个 SQL,一个用于计算最大值,另一个用于比较和过滤。有几种方法可以做到这一点。
  • 寻找相关的子查询并使用 MAX 作为窗口函数。

标签: sql sqlite


【解决方案1】:

我需要为每个组选择具有 MAX(val1) 的行。如果有不止一行具有相等的 val1 我需要从它们中选择具有 MAX(val2) 的行

您可以使用相关子查询:

select n.*
from nums n
where n.num2 = (select max(n2.num2) from nums n2 where n2.num1 = n.num1);

或者窗口函数:

select n.*
from (select n.*,
             row_number() over (partition by num1 order by num2 desc) as seqnum
      from nums n
     ) n
where seqnum = 1;

【讨论】:

  • @GordonLinoff 如果我有两个以上的值,窗口函数会更好吗?
  • @Ae_Mc 这些是两个查询的结果:dbfiddle.uk/… 他们是否返回您的预期结果?
  • @Ae_Mc 。 . .实际上,使用适当的索引,相关子查询通常会快一点,在这种情况下,该索引位于(num1, num2)。不过,窗口函数的表现也相当不错。
  • @forpas 实际上没有,但它给了我一个真正查询的想法:dbfiddle.uk/…
  • @Ae_Mc 这也与您的要求无关。要求在哪里:“如果有不止一行具有相等的 val1,我需要从它们中选择具有 MAX(val2) 的行”?
猜你喜欢
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 2016-01-04
相关资源
最近更新 更多