Сортировать записи БД во вложенном операторе SQL - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть проблема, которую я не могу обойти.С помощью следующего скрипта я получаю несколько дубликатов на основе некоторых критериев.Я хочу отсортировать их в зависимости от даты (O.SL_OBJ_LAST_CHANGED_DATE) и получить только самый старый для каждого source_io

select O.sl_obj_id, O.SL_OBJ_LAST_CHANGED_DATE, tm.source_io
from SL_PP01_FAQ01 F,
     SL_PP01_TRANS_META TM,
     SL_PP01_OBJ O,
     (select source_io, lang
      from SL_PP01_TRANS_META M,
           sl_pp01_obj obj
      where lang <> 'de'
        and M.sl_obj_id = obj.sl_obj_id
        and obj.sl_obj_deleted_flag = 0
      group by source_io, lang
      having count(M.sl_obj_id) > 1) D
WHERE TM.source_io = D.source_io
  AND TM.lang = D.lang
  AND TM.sl_obj_id = F.sl_obj_id
  AND TM.sl_obj_id = O.sl_obj_id
  and O.sl_obj_deleted_flag = 0
order by TM.source_io;

Мой вывод прямо сейчас:

sl_obj_id || sl_obj_last_changed_date || source_io
255018    || 25.01.2017               || 123456
356718    || 23.06.2018               || 123456
467876    || 12.01.2015               || 789012
568631    || 10.08.2014               || 789012
828428    || 10.10.2017               || 135791
424524    || 05.05.2016               || 135791

Мой желаемый вывод будетбыть только более старой датой для каждого из source_io:

sl_obj_id || sl_obj_last_changed_date || source_io
255018    || 25.01.2017               || 123456
568631    || 10.08.2014               || 789012
424524    || 05.05.2016               || 135791

У кого-нибудь есть идеи, как этого добиться?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Используйте функцию row_number ():

with cte1 (sl_obj_id, sl_obj_last_changed_date,source_io) as
(
select O.sl_obj_id, O.SL_OBJ_LAST_CHANGED_DATE, tm.source_io
from SL_PP01_FAQ01 F,
     SL_PP01_TRANS_META TM,
     SL_PP01_OBJ O,
     (select source_io, lang
      from SL_PP01_TRANS_META M,
           sl_pp01_obj obj
      where lang <> 'de'
        and M.sl_obj_id = obj.sl_obj_id
        and obj.sl_obj_deleted_flag = 0
      group by source_io, lang
      having count(M.sl_obj_id) > 1) D
WHERE TM.source_io = D.source_io
  AND TM.lang = D.lang
  AND TM.sl_obj_id = F.sl_obj_id
  AND TM.sl_obj_id = O.sl_obj_id
  and O.sl_obj_deleted_flag = 0
order by TM.source_io;
)

select * from 
(
select sl_obj_id, sl_obj_last_changed_date,source_io, row_number() over(partition by source_io order by sl_obj_last_changed_date) as rn from cte1) a where rn=1
0 голосов
/ 21 сентября 2018

Вы можете попробовать Row_number оконную функцию, чтобы сделать это.

SELECT t1.* FROM (
    SELECT t.*,ROW_NUMBER() OVER(PARTITION  BY source_io ORDER BY sl_obj_last_changed_date ) rn
    FROM youtable t
) t1
where rn = 1

Это полный код.

Я бы использовал JOIN вместо , связанных таблиц, и вы можете попробовать использовать CTE, чтобы код стал понятнее.

with CTE AS (
    select O.sl_obj_id, O.SL_OBJ_LAST_CHANGED_DATE, tm.source_io
    from SL_PP01_FAQ01 F 
    JOIN SL_PP01_TRANS_META TM ON TM.sl_obj_id = F.sl_obj_id
    JOIN SL_PP01_OBJ O ON TM.sl_obj_id = O.sl_obj_id
    JOIN (select source_io, lang
          from SL_PP01_TRANS_META M,
               sl_pp01_obj obj
          where lang <> 'de'
            and M.sl_obj_id = obj.sl_obj_id
            and obj.sl_obj_deleted_flag = 0
          group by source_io, lang
          having count(M.sl_obj_id) > 1) D ON TM.lang = D.lang
    WHERE TM.source_io = D.source_io
      and O.sl_obj_deleted_flag = 0
    order by TM.source_io
)

SELECT t1.* FROM (
    SELECT t1.*,ROW_NUMBER() OVER(PARTITION  BY source_io ORDER BY sl_obj_last_changed_date ) rn
    FROM CTE t1
) t1
where rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...