【问题标题】:Filtering distinct if a value is greater than 0 if it exist [duplicate]如果值大于0,则过滤不同[重复]
【发布时间】:2020-10-13 22:55:45
【问题描述】:

任何人都有更好的想法来解决这个问题。

我有这张桌子

+------+------+
|Id    |Value |
+------+------+
|1     |0     |
+------+------+
|1     |5     |
+------+------+
|2     |0     |
+------+------+
|2     |1     |
+------+------+
|3     |0     |
+------+------+

所以我的目标是获取不同的 Id 并获取第一个非零值(如果存在)。

看起来像这样

+------+------+
|Id    |Value |
+------+------+
|1     |5     |
+------+------+
|2     |1     |
+------+------+
|3     |0     |
+------+------+

我的一个想法是对值求和,因为期望其余部分为 0,但这不起作用,因为它们可能具有超过 1 个值。

在这种情况下,我不在乎得到哪个值,只要我得到一个非零值。

这在 SQL 中是否可行,还是我应该在后端执行此操作?

MySQL 版本:5.7.26

【问题讨论】:

  • 定义“第一”。
  • 第一个非零值,此时如果有多个 id 的值大于零,那么我不在乎我会得到哪个。

标签: mysql select greatest-n-per-group window-functions


【解决方案1】:

如果您运行的是 MySQL 8.0,则可以使用 row_number() - 但您需要一个排序列,否则未定义“第一个”值的概念。我假设ordering_id

select id, value
from (
    select
        t.*,
        row_number() over(
            partition by id 
            order by (value = 0), ordering_id
        ) rn
    from mytable t
) t
where rn = 1

在早期版本中,一种选择是使用子查询。假设你的表的主键是pk,你会这样做:

select t.id, t.value
from mytable t
where t.pk = (
    select t1.pk
    from mytable t1
    where t1.id = t.id
    order by (value = 0), ordering_id
    limit 1
)

【讨论】:

  • 我认为这可以解决我的问题,但我意识到我们正在运行 5.7.26 版,因此无法识别 row_number()。将版本放在问题上。
  • @FranzJustinBuenaventura:你的表的主键是什么?
  • 主键是 Id 但它不是唯一的。感谢您的帮助,但我找到了另一种方法来回答我的问题。
【解决方案2】:

这个解决方案可以满足我的需要:How can I select only the first distinct match from a field in MySQL?

我没有使用 MIN,而是使用了 MAX,因此它将获得最大的值(在我的场景中这没关系,因为只要它存在,我不在乎我得到哪个非零)

干杯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2020-01-02
    • 1970-01-01
    • 2018-12-27
    • 2023-02-22
    • 2012-11-01
    • 2021-05-03
    相关资源
    最近更新 更多