如何 select 在 Oracle SQL 中不使用 distinct 的情况下从多个 max(case when) 派生的唯一行
How to select a unique row derived of multiple max(case when) without using distinct in Oracle SQL
我需要 select 每个 ID 不同文档的最新上传日期,我希望每个 ID 只有一行。
我目前在做什么:
SELECT DISTINCT id,
tree_date,
sun_date
FROM
(SELECT id,
max(CASE
WHEN doc_name LIKE 'tree%' THEN upload_date
END) OVER (PARTITION BY id ORDER BY id) tree_date,
max(CASE WHEN doc_name LIKE 'sun%' THEN upload_date
END) OVER (PARTITION BY id ORDER BY id) sun_date
FROM documents
WHERE doc_name LIKE 'tree%'
OR doc_name LIKE 'sun%' )
此查询有效并给出了我想要的结果,但我认为我没有以最有效的方式select计算每个 ID 文档的最大上传日期。任何人都可以建议一种更有效的方式,而不是 distinct,因为我相信这会大大减慢查询速度。
感谢任何帮助。如果需要更多信息,请告诉我。
您可以尝试使用 row_number()
select * from
(
select id, row_number() over(partition by doc_name,id order by upload_date desc) as rn
from documents
where doc_name like 'tree%' or doc_name like 'sun%'
A where rn=1
使用row_numberwindow功能
select *
from (
select id,doc_name,
row_number() over(partition by id,doc_name order by upload_date desc) n
from documents where doc_name like 'tree%' or doc_name like 'sun%'
) t where t.rn=1
您只需要条件聚合吗?
SELECT id,
MAX(CASE WHEN doc_name LIKE 'tree%' THEN upload_date END) as tree_date,
MAX(CASE WHEN doc_name LIKE 'sun%' THEN upload_date END) as sun_date
FROM documents
WHERE doc_name LIKE 'tree%' OR
doc_name LIKE 'sun%'
GROUP BY id;
我需要 select 每个 ID 不同文档的最新上传日期,我希望每个 ID 只有一行。
我目前在做什么:
SELECT DISTINCT id,
tree_date,
sun_date
FROM
(SELECT id,
max(CASE
WHEN doc_name LIKE 'tree%' THEN upload_date
END) OVER (PARTITION BY id ORDER BY id) tree_date,
max(CASE WHEN doc_name LIKE 'sun%' THEN upload_date
END) OVER (PARTITION BY id ORDER BY id) sun_date
FROM documents
WHERE doc_name LIKE 'tree%'
OR doc_name LIKE 'sun%' )
此查询有效并给出了我想要的结果,但我认为我没有以最有效的方式select计算每个 ID 文档的最大上传日期。任何人都可以建议一种更有效的方式,而不是 distinct,因为我相信这会大大减慢查询速度。
感谢任何帮助。如果需要更多信息,请告诉我。
您可以尝试使用 row_number()
select * from
(
select id, row_number() over(partition by doc_name,id order by upload_date desc) as rn
from documents
where doc_name like 'tree%' or doc_name like 'sun%'
A where rn=1
使用row_numberwindow功能
select *
from (
select id,doc_name,
row_number() over(partition by id,doc_name order by upload_date desc) n
from documents where doc_name like 'tree%' or doc_name like 'sun%'
) t where t.rn=1
您只需要条件聚合吗?
SELECT id,
MAX(CASE WHEN doc_name LIKE 'tree%' THEN upload_date END) as tree_date,
MAX(CASE WHEN doc_name LIKE 'sun%' THEN upload_date END) as sun_date
FROM documents
WHERE doc_name LIKE 'tree%' OR
doc_name LIKE 'sun%'
GROUP BY id;