Удаление повторяющихся записей с несколькими столбцами с несколькими условиями - PullRequest
0 голосов
/ 17 мая 2019

У меня есть Таблица1:

----------------------------------
| Id   |     Value  |     Date   |
----------------------------------
| 1    |      xxx   | 05/01/2015 |
| 2    |      xxx   | 05/02/2015 |
| 3    |      yyy   | 06/01/2015 |
| 4    |      yyy   | 06/01/2015 |
----------------------------------

Удалите дублирующую строку, используя самую последнюю дату, если эта дата равна, удалите дублирующую строку, используя последний идентификатор.(Другими словами, сохраните самую последнюю дату и последний идентификатор, удалите старую дату и идентификатор)

Нет программирования, только запрос.Таблица является одной из таблиц соединения в запросе множественного объединения.

Должна быть совместима с Vertica.

Ответы [ 3 ]

1 голос
/ 17 мая 2019

Следующий оператор удаляет повторяющиеся строки и сохраняет самый высокий идентификатор:

DELETE t1 FROM table1 t1
    INNER JOIN
    table1 t2 
WHERE
    t1.id < t2.id AND t1. Date = t2. Date;

может быть полезным для вас, и вы можете изменить в соответствии с вашими потребностями

0 голосов
/ 19 мая 2019

Если вы хотите присоединиться к этой таблице с чем-то еще, вы также можете просто захотеть иметь строки, которые вам нужны, без необходимости удалять вещи перед присоединением.

Vertica предлагает аналитическое предельное условие , которое может пригодиться здесь.

Вот как это будет работать с вашими входными данными:

WITH
input(Id,Value,Date) AS (
          SELECT 1,'xxx',DATE '2015-05-01'
UNION ALL SELECT 2,'xxx',DATE '2015-05-02'
UNION ALL SELECT 3,'yyy',DATE '2015-06-01'
UNION ALL SELECT 4,'yyy',DATE '2015-06-01'
)
SELECT
 *
FROM input
LIMIT 1 OVER(PARTITION BY Value ORDER BY Date DESC, id DESC);
-- out  Id | Value |    Date    
-- out ----+-------+------------
-- out   2 | xxx   | 2015-05-02
-- out   3 | yyy   | 2015-06-01
-- out (2 rows)
-- out 
-- out Time: First fetch (2 rows): 14.240 ms. All rows formatted: 14.276 ms

Поможет ли это ...?

Что ж, если вам действительно нужно удалить, вы также можете использовать вышеупомянутое в предикате NOT IN для запуска удаления ... как я делаю здесь:

-- creating a temp table to delete from  ....
CREATE LOCAL TEMPORARY TABLE t1 (Id,Value,Date) 
ON COMMIT PRESERVE ROWS AS (   
          SELECT 1,'xxx',DATE '2015-05-01'
UNION ALL SELECT 2,'xxx',DATE '2015-05-02'
UNION ALL SELECT 3,'yyy',DATE '2015-06-01'
UNION ALL SELECT 4,'yyy',DATE '2015-06-01'
);
-- delete as announced ..
DELETE FROM t1 WHERE id NOT IN (
  SELECT
    id
  FROM t1
  LIMIT 1 OVER(PARTITION BY Value ORDER BY Date DESC, id DESC)
);
-- check the content now ...
SELECT * FROM t1;
-- out CREATE TABLE
-- out Time: First fetch (0 rows): 16.081 ms. All rows formatted: 
-- 16.110 ms
-- out  OUTPUT 
-- out --------
-- out       2
-- out (1 row)
-- out 
-- out Time: First fetch (1 row): 61.740 ms. All rows formatted:
--    61.788 ms
-- out  Id | Value |    Date    
-- out ----+-------+------------
-- out   2 | xxx   | 2015-05-02
-- out   3 | yyy   | 2015-06-01
-- out (2 rows)
-- out Time: First fetch (2 rows): 6.761 ms. 
-- All rows formatted: 6.814 ms
0 голосов
/ 17 мая 2019

Я думаю, что Vertica поддержит это:

delete table1
where table1.id not in (select t2.id
                        from (select t2.*
                                     row_number() over (partition by t2.value order by t2.date, t2.id desc) as seqnum
                              from table1 t2
                             )
                         where seqnum = 1
                        );
...