Как выбрать уникальную строку, полученную из нескольких max (case, когда), без использования различных в Oracle SQL - PullRequest
0 голосов
/ 05 февраля 2019

Мне нужно выбрать самую последнюю дату загрузки для разных документов для каждого идентификатора, и я хотел бы, чтобы для одного идентификатора была только одна строка.

Что я сейчас делаю:

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%' )

Этот запрос работает и дает мне желаемые результаты, но я не думаю, что выбираю максимальную дату загрузки документа для идентификатора наиболее эффективным способом.Может кто-нибудь предложить более эффективный способ предпочтительнее без четких, поскольку я считаю, что это значительно замедляет запрос.

Любая помощь приветствуется.Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

использовать функцию окна 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
0 голосов
/ 05 февраля 2019

Вы просто хотите условную агрегацию?

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;
0 голосов
/ 05 февраля 2019

Вы можете попробовать использовать 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
...