我在Teradata中有一个这样的表。客户端可以在系统"A"或"b"中或在两者中都有记录。还有一个值可以为null。
客户端 | 系统 | 值|
---|---|---|
A | A | <1>|
B | B | 空 |
C | a | 2 |
C | b | 空 |
D | a | 空 |
D | b | 3 |
E | a | 4 |
E | b | 5 |
F | a | 空 |
F | b | 空 |
您可以使用quality
和row_number()
:
select t.*
from t
qualify row_number(partition by client
order by (case when value is not null then 1 else 2 end),
system
) = 1;
Qualify
是一个子句,用于筛选窗口函数的结果。另一种选择(在其他数据库中(通常是子查询或CTE。
关键思想是将您的条件表示为行的排序。订单为:
- 将非
NULL
值放在第一位 - 按
system
排序,因此如果有重复,则a
优先