如果值大于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 group by 和 sum 基于其他列中的不同值(如果其他列中的值重复,则求和一次)