我正在尝试基于多个条件从数据集中删除行,但是收到语法错误。这是当前代码:
With cte As (
Select *,
Row_Number() Over(Partition By ID, Numb1 Order by ID) as RowNumb
from DataSet
)
Delete from cte Where RowNumb > 1;
数据集的外观如下:
我要删除ID和Numb1相同的所有记录。因此,我希望代码删除以下所有行:
答案 0 :(得分:0)
Vertica中的WITH子句仅支持SELECT或INSERT,不支持DELETE / UPDATE。
答案 1 :(得分:0)
cte是一个临时表。您无法从中删除。它实际上是只读的。
如果您尝试从原始DataSet表中删除重复项,则必须从DataSet中删除,而不是从cte表中删除。
尝试一下:
with cte as
(
select
ID,
Row_Number() Over(Partition By ID, Numb1 Order by ID) as RowNumb
from
DataSet
)
delete from DataSet where ID in (select ID from cte where RowNumb > 1)
答案 2 :(得分:0)
无法从CTE中删除。只需手动使用delete语法但回滚事务,或者如果您具有权限,则可以随时复制它并进行测试。
答案 3 :(得分:0)
我对Vertica不太了解,但是对于delete
语句似乎不太灵活。
一种方法是使用临时表存储要保留的行,然后截断原始表,然后从临时表插入到表中:
create temporary table MyTempTable as
select id, numb1, state_coding
from (select t.*, count(*) over(partition by id, numb1) cnt from DataSet) as t
where cnt = 1;
truncate table DataSet;
insert into DataSet
select id, numb1, state_coding from MyTempTable;
请注意,我使用的是窗口计数而不是row_number
。这将删除至少存在另一个具有相同id
和numb1
的记录,这是我从样本数据和预期结果中所希望的。
重要:在执行此操作之前,请确保备份整个表!
答案 4 :(得分:0)
如果您将数据粘贴为文本而不是图片,您将节省大约5分钟的时间-因为我无法复制粘贴并不得不重新输入...
说过:
在此处重建表:
DROP TABLE IF EXISTS input;
CREATE TABLE input(id,numb1,state_coding) AS (
SELECT 202003,4718868,'D'
UNION ALL SELECT 202003, 35756,'AA'
UNION ALL SELECT 204281, 146199,'D'
UNION ALL SELECT 204281, 146199,'D'
UNION ALL SELECT 204346, 108094,'D'
UNION ALL SELECT 204346, 108094,'D'
UNION ALL SELECT 204389, 14642,'DD'
UNION ALL SELECT 204389, 96504,'F'
UNION ALL SELECT 204392, 22010,'D'
UNION ALL SELECT 204392, 8051,'G'
UNION ALL SELECT 204400, 74118,'D'
UNION ALL SELECT 204400, 103900,'D'
UNION ALL SELECT 204406,1387304,'D'
UNION ALL SELECT 204406, 0,'HJ'
UNION ALL SELECT 204516, 894,'D'
UNION ALL SELECT 204516, 3927,'D'
UNION ALL SELECT 204586, 234235,'D'
UNION ALL SELECT 204586, 234235,'D'
)
;
然后: 根据其他答复中所说的内容,并记住,不仅要在Vertica中大规模删除表的重要部分,最好将其实现为INSERT ... SELECT并以WHERE条件反转的条件-在这里:>
CREATE TABLE input_help AS
SELECT * FROM input
GROUP BY id,numb1,state_coding
HAVING COUNT(*) = 1;
DROP TABLE input;
ALTER TABLE input_help RENAME TO input;
至少,如果整行都相同,它就可以非常简单地工作-我注意到您自己没有将state_coding放入条件中。否则,它将变得更加复杂。
还是您想在以后分别重新插入一行重复内容?
然后,将input_help
编译为SELECT DISTINCT * FROM input;
,然后放下,然后重命名。