按列分组,优先选择另一列不为空的行

Posted

技术标签:

【中文标题】按列分组,优先选择另一列不为空的行【英文标题】:Group by column with preference for rows in which another column is not null 【发布时间】:2020-10-01 17:20:52 【问题描述】:

假设我有一个看起来像这样的表,有两个外键:

| col1 | fkey1 | fkey2 |
|------|-------|-------|
| foo  | 123   | null  |
| foo  | 123   | 456   |
| bar  | 789   | null  |

我将如何按col1 分组,优先选择fkey2 不是 null 所在的行?所以结果看起来像这样:

| col1 | fkey1 | fkey2 |
|------|-------|-------|
| foo  | 123   | 456   |
| bar  | 789   | null  |

另一个考虑因素是fkey1 有一个not null 约束,而fkey2 没有。

【问题讨论】:

fkey2 是否定义为 UNIQUE?如果不是,从具有不同非空值的同行中选择哪一行?会涉及更多的列吗?使用显示数据类型和约束的CREATE TABLE 语句,这个问题会更有用。 【参考方案1】:

对于这个数据集,您可以使用简单的聚合:

select col1, fkey1, max(fkey2) fkey2
from mytable
group by col1, fkey1

但我怀疑你实际上想要distinct on

select distinct on(col1) t.*
from mytable t
order by col1, fkey2

【讨论】:

以上是关于按列分组,优先选择另一列不为空的行的主要内容,如果未能解决你的问题,请参考以下文章

SQL:如何在 B 列不为空的情况下使用“100”更新 A 列

C二维数组行为空,列不为空

excel 怎样筛选出 有一个值为空的行

sql查询不为空的字段

pandas 某列不为空的行

Python Pandas:获取列不为空的DataFrame的行