使用窗口功能更新表

时间:2015-10-07 13:15:54

标签: sql postgresql amazon-redshift window-functions

我在Redshift中的表中有要删除的重复行,

为此我创建了文件ID,我想更新他以删除重复的行 我试图运行此查询,但它不起作用

update mr_usage
set id=row_number () over (partition by uid,date(ts),title order by ts)

我收到以下错误:

错误:无法在UPDATE中使用窗口函数

我正在寻找更新该字段的方法

2 个答案:

答案 0 :(得分:4)

另一种可能的解决方案(没有CTE)直接使用UPDATE .. FROM语法和子查询

UPDATE mr_usage
SET id = sub.new_id
FROM (
    SELECT 
        id, ROW_NUMBER() OVER (PARTITION BY uid, date(ts), title ORDER BY ts) AS new_id
    FROM
        mr_usage
) sub
WHERE id = sub.id

但是自PostgreSQL 8.4以来它也可用。

答案 1 :(得分:1)

您可以尝试使用CTE来实现此目的,但这样的UPDATE不会删除任何重复的行。

WITH n AS (
  SELECT
    id AS current_id,
    ROW_NUMBER() OVER (PARTITION BY uid, date(ts), title ORDER BY ts) AS new_id
  FROM
    mr_usage
)
UPDATE
  mr_usage
SET
  id = n.new_id
FROM
  n
WHERE
  mr_usage.id = n.current_id;