SQL дубликатов записей - PullRequest
0 голосов
/ 14 апреля 2020

Моя проблема в следующем! Я пытаюсь извлечь записи из базы данных, чтобы создать файл с ними. Я прикрепляю запрос, который сейчас выполняю:

SELECT DISTINCT '' || '|' ||

        TIME_STAMP || '|' ||

        CLIENT_APP || '|' ||

        INSTANCE_ID || '|' ||

        SERVICE_NAME || '|' ||

        DATE_HOUR_EXECUTION || '|' ||

        STATE_COD || '|' ||

        ERROR_DESC || '|' ||

        LOG_ID || '|' ||

        ''

FROM TABLE_VC.ACCESS_LOG

WHERE TO_CHAR(TRUNC(TO_DATE(TIME_STAMP,'YYYY-MM-DD HH24:MI:SS')), 'YYYY-MM-DD HH24:MI:SS') = TO_CHAR(TRUNC(CURRENT_TIMESTAMP)-2, 'YYYY-MM-DD HH24:MI:SS');

Проблема, с которой я столкнулся, заключается в том, что я хочу получить все записи со всеми столбцами, и в случае, если в столбце LOG_ID есть повторяющиеся записи, просто возьмите один из этих дубликатов записей. Но с текущим запросом он не работает для меня.

Исходные записи:

values ('2020-04-12 18:46:48','WEB','bck83kuf5ddpgc2thr4anf3d6jpvgm2sk5e4pcke8jncijmm3s052tv07imnr92cj5obqm4dejagkjh8','service','SERVICE','2020-04-12 18:46:48','0','REQUEST-aaaaaaaaaaaaaaaaaaaaaaa');

values ('2020-04-12 18:46:48','WEB','bck83kuf5ddpgc2thr4anf3d6jpvgm2sk5e4pcke8jncijmm3s052tv07imnr92cj5obqm4dejagkjh8','service','SERVICE','2020-04-12 18:46:48','0','REQUEST-bbbbbbbbbbbbbbbbbbbbbbb');

values ('2020-04-12 18:46:48','WEB','bck83kuf5ddpgc2thr4anf3d6jpvgm2sk5e4pcke8jncijmm3s052tv07imnr92cj5obqm4dejagkjh8','service','SERVICE','2020-04-12 18:46:48','0','REQUEST-ccccccccccccccccccccccc');

values ('2020-04-12 18:46:48','WEB','bck83kuf5ddpgc2thr4anf3d6jpvgm2sk5e4pcke8jncijmm3s052tv07imnr92cj5obqm4dejagkjh8','service','SERVICE','2020-04-12 18:46:48','0','REQUEST-aaaaaaaaaaaaaaaaaaaaaaa');

values ('2020-04-12 18:46:48','WEB','bck83kuf5ddpgc2thr4anf3d6jpvgm2sk5e4pcke8jncijmm3s052tv07imnr92cj5obqm4dejagkjh8','service','SERVICE','2020-04-12 18:46:48','0','REQUEST-ddddddddddddddddddddddd');

Желаемые записи:

values ('2020-04-12 18:46:48','WEB','bck83kuf5ddpgc2thr4anf3d6jpvgm2sk5e4pcke8jncijmm3s052tv07imnr92cj5obqm4dejagkjh8','service','SERVICE','2020-04-12 18:46:48','0','REQUEST-aaaaaaaaaaaaaaaaaaaaaaa');

values ('2020-04-12 18:46:48','WEB','bck83kuf5ddpgc2thr4anf3d6jpvgm2sk5e4pcke8jncijmm3s052tv07imnr92cj5obqm4dejagkjh8','service','SERVICE','2020-04-12 18:46:48','0','REQUEST-bbbbbbbbbbbbbbbbbbbbbbb');

values ('2020-04-12 18:46:48','WEB','bck83kuf5ddpgc2thr4anf3d6jpvgm2sk5e4pcke8jncijmm3s052tv07imnr92cj5obqm4dejagkjh8','service','SERVICE','2020-04-12 18:46:48','0','REQUEST-ccccccccccccccccccccccc');

values ('2020-04-12 18:46:48','WEB','bck83kuf5ddpgc2thr4anf3d6jpvgm2sk5e4pcke8jncijmm3s052tv07imnr92cj5obqm4dejagkjh8','service','SERVICE','2020-04-12 18:46:48','0','REQUEST-ddddddddddddddddddddddd');

Удалить один из дубликатов регистров с LOD_ID 'ЗАПРОС-ааааааааааааааааааааааа'.

С уважением!

1 Ответ

2 голосов
/ 14 апреля 2020

Вы можете использовать функцию ROW_NUMBER. Следующий запрос должен помочь вам:

SELECT sub.time_stamp, sub.client_app, sub.instance_id, 
       sub.service_name, sub.date_hour_execution, 
       sub.state_cod, sub.error_desc, sub.log_id
FROM (SELECT al.*,
             ROW_NUMBER() OVER (PARTITION BY al.log_id ORDER BY al.time_stamp) AS ROW_N
      FROM access_log al
      WHERE TRUNC(SYSDATE-al.time_stamp) = 2) sub
WHERE sub.row_n = 1;

Я создал этот DBFiddle для вас, чтобы играть с. ( Ссылка )

Запрос использует ROW_NUMBER для ранжирования строк для каждого LOG_ID на основе TIME_STAMP. Затем внешний запрос ограничивает результаты только строкой с самым высоким рейтингом.

...