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

我需要根据以下逻辑过滤行,以便每个客户端只有一行:

简单地说-首先喜欢值不为空,其次是系统a或系统b。

结果:

client system value
A a 1
B b null
C a 2
D b 3
E a 4
F a null

知道如何实现吗? 谢谢,罗伯特

您可以使用 qualityrow_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 排在第一位。