如何 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;