【问题标题】:SQL filter according to two columnSQL 根据两列过滤
【发布时间】:2018-11-05 05:34:50
【问题描述】:

输入

这是我的名为“MYTABLE”的表 P3 的值是恒定的。但是P1和P2的值可以是任意整数!!!

目标

我的目标是按 CITY AND PROD 对每个 city-prod 组合进行分组,然后(对于每个 city-prod)取 P3 的最小值。 但我想在结果中保留 P1 和 P2 的值。

查询

到目前为止,我已经尝试了以下查询,它没有提供我要查找的输出。

SELECT CITY, PROD, MIN(P3)
FROM MYTABLE
GROUP BY CITY, PROD

结果显示 2 行。 2 行是正确的,但我松动了 P1 和 P2 列。

预期输出

所以我的问题是如何编写查询来保持 P1 和 P2 的值。 (见下图)

PS:我并不是绝对希望在查询中使用“GROUP BY”。如果有另一种方法来解决它也很棒。不知何故,我发现目标并不太复杂,但由于某种原因,我无法弄清楚(即使在网上看过之后)如何解决这个问题。

【问题讨论】:

  • 那么你想要 P1 和 P2 的最大值吗?

标签: sql group-by selection aggregation


【解决方案1】:

您想使用分区根据p3 的值为cityprod 的每组选择正确的行:

with cte as (select *, row_number() over(partition by city, prod order by p3) as rn
             from table1)
select city, prod, p1, p2, p3
from cte
where rn = 1

你可以在here看到它。

【讨论】:

  • 您好,非常感谢您的询问。我将详细研究这个(我从未使用过 row_number() 并且我不熟悉 WITH....)但是,它似乎很有魅力。
  • row_number() 因为我使用它实际上添加了一个额外的列 rn,它唯一地标识每个子组中的行(每个 cityprod)从 1 开始。我排序p3 的子组,所以我可以安全地删除除 1 之外的每一行——这就是 where 子句所做的。
  • 删除where并将rn添加到第二个select,你就会明白我的意思了:)
  • 你好 Blindy,我刚刚发现如果 P3 中存在空值和零值,则输出不是我所期望的。想象一下,对于 NY PIE,值是“null”和“0”[而不是 2 和 1]。在这种情况下,是否有可能得到 0 而不是 null。换句话说,是否可以忽略查询中的空值?
  • 当然,你可以在内部查询中放任何你想要的条件,只需添加一个where子句
【解决方案2】:

我会使用row_num 窗口函数根据它们的p3 值对行进行排序并取第一个:

SELECT city, prod, p1, p2, p3
FROM   (SELECT city, prod, p1, p2, p3,
               ROW_NUM() OVER (PARTITION BY city, prod ORDER BY p3 DESC) AS rn
        FROM   mytable) t
WHERE  rn = 1

【讨论】:

  • 非常感谢,我看到它可以与 postgres 一起使用,但由于某种原因 HANA 不支持它。我没有提到数据库技术,因为我假设查询会比我预期的更简单。所以我想我会接受 Blindy 的解决方案,但当然你的解决方案对于其他数据库来说似乎是完美的。
  • 请注意,我的是 T-Sql。我不知道 HANA 是什么,但如果我的工作正常,那么它可能基于 Microsoft Sql Server。它很可能不适用于其他任何东西,CTE 表达式是 Microsoft 特定的。
猜你喜欢
  • 1970-01-01
  • 2021-07-03
  • 2021-10-17
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
相关资源
最近更新 更多