如果值大于0,则过滤不同[重复]

Posted

技术标签:

【中文标题】如果值大于0,则过滤不同[重复]【英文标题】:Filtering distinct if a value is greater than 0 if it exist [duplicate] 【发布时间】: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 的值大于零,那么我不在乎我会得到哪个。 【参考方案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,因此它将获得最大的值(在我的场景中这没关系,因为只要它存在,我不在乎我得到哪个非零)

干杯

【讨论】:

以上是关于如果值大于0,则过滤不同[重复]的主要内容,如果未能解决你的问题,请参考以下文章

SQL如何查询出某一列中不同值出现的次数?

SQL group by 和 sum 基于其他列中的不同值(如果其他列中的值重复,则求和一次)

如果所需的列值重复 [重复],则 SQL 查询以获取顶部记录

如果列中的值在一组值列表中,则过滤数据框行[重复]

根据不同列中的值删除重复项

Pandas过滤值小于10且大于1000的数据帧行[重复]