繁体   English   中英

如何在不使用Oracle SQL的情况下选择从多个max(case when)派生的唯一行

[英]How to select a unique row derived of multiple max(case when) without using distinct in Oracle SQL

我需要为每个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%' )

该查询有效,并给了我我想要的结果,但是我不相信我以最有效的方式为每个id选择文档的最大上传日期。 任何人都可以提出一种更有效的方法,最好是不加区分,因为我相信这会大大降低查询速度。

任何帮助表示赞赏。 请让我知道是否需要更多信息。

使用row_number窗口功能

      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;

您可以尝试使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM