Удалить дублированную запись - PullRequest
0 голосов
/ 03 октября 2019

У меня есть таблица, которая содержит много повторяющихся строк, например:

 id_emp  id       date      ch_in        ch_out
    1   34103   2019-09-01      
    1   34193   2019-09-01  17:00
    1   34194   2019-09-02  07:03:21    16:59:26
    1   34104   2019-09-02  07:03:21    16:59:26
    1   33361   2019-09-02  NULL        NULL

Я хочу только одну строку для каждой даты, а другие должны быть удалены с условием, как будто я хочу, чтобы результат был:

       id_emp  id       date      ch_in        ch_out
        1   34193   2019-09-01  17:00
        1   34104   2019-09-02  07:03:21    16:59:26

Я пытался использовать разные, но ничего не работало:

select  distinct id_emp, id, date_1, ch_in,ch_out
from ch_inout
where id_emp=1 order by date_1 asc

И я тоже пытался использовать этот запрос для удаления:

select *
from (
  select *, rn=row_number() over (partition by date_1 order by id)
  from ch_inout 
) x
where rn > 1;

Но результат не работаетпуст.

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Вы можете использовать агрегацию:

select id_emp, max(id) as id, date, min(ch_in), max(ch_out)
from ch_inout
group by id_emp, date;

Возвращает максимум id для каждой группы строк. Это не совсем то, что возвращается в вопросе, но вы не указываете логику.

РЕДАКТИРОВАТЬ:

Если вы хотите удалить все, кроме самого большого идентификатора для каждого id_emp /date комбинация, вы можете использовать:

delete c from ch_inout c
    where id < (select max(c2.id)
                from ch_inout c2
                where c2.id_emp = c.id_emp and c2.date = c.date
               );
0 голосов
/ 03 октября 2019

Вы можете использовать ROW_NUMBER() для идентификации записей, которые вы хотите удалить. Предполагая, что вы хотите сохранить запись с самым низким значением id для каждого date:

SELECT *
FROM (
    SELECT
        t.*,
        ROW_NUMBER() OVER(PARTITION BY date ORDER BY id) rn
    FROM ch_inout t
) x
WHERE rn > 1

Вы можете легко превратить это в оператор DELETE:

WITH cte AS (
    SELECT
        t.*,
        ROW_NUMBER() OVER(PARTITION BY date ORDER BY id) rn
    FROM ch_inout t
)
DELETE FROM cte WHERE rn > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...