SQL 使用两列过滤记录
SQL filter records using two columns
我在 Teradata 中有一个这样的 table。客户可以在系统 'a' 或 'b' 或两者中都有记录。并且有一个值可以为空。
client
system
value
A
a
1
B
b
null
C
a
2
C
b
null
D
a
null
D
b
3
E
a
4
E
b
5
F
a
null
F
b
null
我需要根据以下逻辑过滤行,以便每个客户端只有一行:
- 如果只有一个record/one系统(客户端A,B),显示它(无论值是否为NULL或系统是什么)。
- 如果客户端在两个系统(客户端 C、D)中并且一个值为空,则显示值为 NOT NULL 的行。
- 如果客户端在两个系统中并且值在两个系统(客户端 E)中都不是空值或在两个系统中都是空值(客户端 F),则显示系统 a 而不是系统 b。
简单地说-首先喜欢值不为空,其次是系统a或系统b。
结果:
client
system
value
A
a
1
B
b
null
C
a
2
D
b
3
E
a
4
F
a
null
知道如何实现吗?
谢谢,罗伯特
您可以使用 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
是一个子句,可让您过滤 window 函数的结果。替代方案(在其他数据库中)通常是子查询或 CTE。
关键思想是将您的条件表达为行的排序。顺序是:
- 将非
NULL
值放在第一位。
- 按
system
排序,因此如果有重复项,则 a
排在第一位。
我在 Teradata 中有一个这样的 table。客户可以在系统 'a' 或 'b' 或两者中都有记录。并且有一个值可以为空。
client | system | value |
---|---|---|
A | a | 1 |
B | b | null |
C | a | 2 |
C | b | null |
D | a | null |
D | b | 3 |
E | a | 4 |
E | b | 5 |
F | a | null |
F | b | null |
我需要根据以下逻辑过滤行,以便每个客户端只有一行:
- 如果只有一个record/one系统(客户端A,B),显示它(无论值是否为NULL或系统是什么)。
- 如果客户端在两个系统(客户端 C、D)中并且一个值为空,则显示值为 NOT NULL 的行。
- 如果客户端在两个系统中并且值在两个系统(客户端 E)中都不是空值或在两个系统中都是空值(客户端 F),则显示系统 a 而不是系统 b。
简单地说-首先喜欢值不为空,其次是系统a或系统b。
结果:
client | system | value |
---|---|---|
A | a | 1 |
B | b | null |
C | a | 2 |
D | b | 3 |
E | a | 4 |
F | a | null |
知道如何实现吗? 谢谢,罗伯特
您可以使用 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
是一个子句,可让您过滤 window 函数的结果。替代方案(在其他数据库中)通常是子查询或 CTE。
关键思想是将您的条件表达为行的排序。顺序是:
- 将非
NULL
值放在第一位。 - 按
system
排序,因此如果有重复项,则a
排在第一位。