Select A 行如果条件满足 else select 每个组的 B 行

Select row A if a condition satisfies else select row B for each group

我们有 2 张桌子、预订和文档

预订

booking_id    |  name    
100           |  "Val1"  
101           |  "Val5"  
102           |  "Val6"

文档

doc_id  |  booking_id  |  doc_type_id  
6       |  100         | 1
7       |  100         | 2
8       |  101         | 1
9       |  101         | 2
10      |  101         | 2

我们需要这样的结果:

booking_id | doc_id
100        | 7
101        | 10

本质上,我们试图获取每个预订的文档的最新记录,但是如果 doc_type_id 2 存在,select 文档类型 2 的最新记录否则 select 最新doc_type_id 1.

的记录

这是否可以通过性能友好的查询来实现,因为我们需要在非常大的查询中应用它?

您可以使用 FIRST_VALUE() window 函数对每个 booking_id 的行进行正确排序,以便首先返回带有 doc_type_id = 2 的行:

SELECT DISTINCT booking_id,  
       FIRST_VALUE(doc_id) OVER (PARTITION BY booking_id ORDER BY doc_type_id = 2 DESC, doc_id DESC) rn
FROM docs;

如果您想要返回完整的行,那么您可以使用 ROW_NUMBER() window 函数:

SELECT booking_id, doc_id, doc_type_id  
FROM (
  SELECT *, 
         ROW_NUMBER() OVER (PARTITION BY booking_id ORDER BY doc_type_id = 2 DESC, doc_id DESC) rn
  FROM docs
) t
WHERE rn = 1;