SQL 重复记录

SQL duplicate records

我的问题如下!我试图从数据库中提取记录,以便用它们生成一个文件。我附上我目前正在做的查询:

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 'REQUEST-aaaaaaaaaaaaaaaaaaaaaaa'。

此致!

您可以使用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 供您使用。 (Link)

查询使用 ROW_NUMBER 根据 TIME_STAMP 对每个 LOG_ID 的行进行排名。然后外部查询将结果限制为仅排名最高的行。