mysql - 当另一列满足条件时获取一列的值
问题描述
column1 column2 column3
aa 1 x
aa 2 x
aa 3 y
aa 4 y
bb 1 x
bb 2 y
bb 3 y
cc 1 x
cc 2 z
cc 3 z
然后我想要一个列 col4,当 col3='y' 被 col1 分区时,它给出 col2 的最小值。原始数据集无序
column1 column2 column3 column4
aa 1 x 3
aa 2 x 3
aa 3 y 3
aa 4 y 3
bb 1 x 2
bb 2 y 2
bb 3 y 2
cc 1 x NULL
cc 2 z NULL
cc 3 z NULL
我想在 column3 最初为每个 ID 具有值“y”时获取 column2 值。真正的桌子很复杂而且很大。我尝试使用least(case when...) with over partition by group by
,但它会引发错误,因为这里不需要“Over”。如果我使用 group by,我会收到许多其他分类列未分组的错误。它仅适用于应用于如下列的任何函数,但它没有给我所需的结果。
least(case when (lag( column3) over (partition by column1 order by column2))='y'
then column2 else NULL end ) as required_column_values from t
解决方案
如果您的 MySql 版本是 8.0+,您可以使用MIN()
窗口函数:
SELECT *,
MIN(CASE WHEN column3 = 'y' THEN column2 END) OVER (PARTITION BY column1) column4
FROM tablename
对于以前的版本,使用相关子查询:
SELECT t1.*,
(SELECT MIN(t2.column2) FROM tablename t2 WHERE t2.column1 = t1.column1 AND t2.column3 = 'y') column4
FROM tablename t1
见演示。
推荐阅读
- angular - Angular 9 Highcharts - 当使用带有类型规的系列类型饼图时,饼图的 innerSize 不起作用
- java - 如何将文本密码与使用 spring data jpa 散列的密码进行比较?
- java - Json To Java 列表并验证
- javascript - 通过 axios React 发出 POST 请求的 Laravel 419 错误
- python - 如何将一个全新的元素(在 Python 中使用 ElementTree)添加到 XML 文件
- javascript - 有没有办法在matter.js上制作身体后清除所有东西?
- python-3.x - 我如何让这些在任何 Windows pc 上工作
- javascript - Fabricjs - 通过 loadFromJSON 在 FabricJs 中预览视频
- c# - 我怎么知道两个班级都来自同一个通用班级
- ada - 对 Ada 的最后一次重大更改