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