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;
我们有 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;