【问题标题】:Update table with window function使用窗口函数更新表
【发布时间】:2016-01-04 17:52:37
【问题描述】:

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

为此我创建了归档 ID,我想更新他以删除重复的行 我正在尝试运行此查询,但它不起作用

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

我收到以下错误:

错误:不能在 UPDATE 中使用窗口函数

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

【问题讨论】:

  • 也许把 row_number() 和朋友放到一个 subquwery 中,然后更新?

标签: sql postgresql amazon-redshift window-functions


【解决方案1】:

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

UPDATE mr_usage outer
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 outer.id = sub.id

但它也可以从 PostgreSQL 8.4 开始使用。

【讨论】:

    【解决方案2】:

    您可以尝试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;
    

    【讨论】:

    • 我收到以下错误:ERROR: syntax error at or near "UPDATE"
    • 如果 redshift 基于 pg-8.0,将没有 CTE,也没有窗口函数。 (这些都在 pg-8.4,IIRC 中引入)
    • 我可以运行windows功能,不能说CTE,因为我不知道,还有其他选择吗?
    • @user3600910 look at my answer 用于不同的方法。
    • CTE(或 WITH 子句)在 Redshift 中受支持,几乎没有限制,请参阅文档 docs.aws.amazon.com/redshift/latest/dg/r_WITH_clause.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多