在更新语句中使用Row_Number()

奥利维亚·伦迪(Olivia Lundy)

希望只是一个简单的问题。我难以确定要在UPDATE语句上使用row_number()的问题。

假设我有一个书架表:

userid  createddate bookid  pagenumber
1       2021-18-01  charper    141
1       2021-17-01  mproust    136
1       2021-17-01  sking       134
1       2021-15-01  charper    128
1       2021-10-01  jausten    122
2       2021-18-01  vwoolf    141
2       2021-17-01  vwoolf    136
2       2021-17-01  charper    134

我要(总和)相同的bookid页码并写入右列。我的预期结果必须是:

userid  createddate      bookid pagenumber  countrow
1         2021-18-01    charper  141        269
1         2021-17-01    mproust  136        136
1         2021-17-01    sking    134        134
1         2021-15-01    charper  128        
1         2021-11-01    jausten  122        122
2         2021-18-01    vwoolf   141        277
2         2021-17-01    vwoolf   136        
2         2021-17-01    charper  134        134

我的SELECT语句

SELECT userid, bookid, pagenumber,
       case when row_number() over (partition by userid, bookid order by bookid) = 1 
            then sum(pagenumber) over (partition by userid, bookid) 
       end as countrow
  from usertable;

上面的sql查询在temp列上显示countrow效果很好。我想存储所有这些输出。所以我改为声明:

UPDATE bookshelf
SET countrow = countrow_new
FROM ( select userid, createddate, bookid, pagenumber,
       case when row_number() over (partition by userid, bookid, order by bookid) = 1
            then sum(pagenumber) over (partition by userid, bookid) 
       end as countrow_new
  from bookshelf
      )x

此查询似乎无法正常工作。它使用错误的值更新计数行中的所有单元格。我搜索到谷歌,发现有用的东西,如SqlHack RowcountSqlServer参考页,但没什么。有谁知道这里发生了什么,还是有人有类似的问题?如何解决这个问题以获得预期的结果?

1986年

您正在尝试更新countrow表中不存在的列(),因此您需要将此列添加到原始表中并加入子查询:

/* add the column */
ALTER TABLE usertable ADD countrow INT;

/* do the update */
UPDATE  usertable
SET     countrow = countrow_new
FROM ( 
        SELECT  userid, 
                createddate, 
                bookid, 
                pagenumber,
                CASE 
                    WHEN ROW_NUMBER() OVER (PARTITION BY userid, bookid ORDER BY bookid) = 1
                    THEN SUM(pagenumber) OVER (PARTITION BY userid, bookid) 
                END AS countrow_new
        FROM    usertable
      ) x
      JOIN usertable u
        ON u.bookid = x.bookid AND u.createddate = x.createddate AND u.userid = x.userid;

以上假设{bookid,createddate,userid}将永远是唯一的

但是,以这种方式将计算结果存储在表中是非常糟糕的设计和坏习惯-您将不得不在每次插入/更新/删除操作时都使用触发器来使列保持最新状态,这对于性能而言是非常糟糕的。

更好的方法是获取原始查询并为其创建视图,然后可以将其视为表使用:

创建视图:

CREATE VIEW vwMyView
AS
SELECT  userid, 
        bookid, 
        pagenumber,
        CASE 
            WHEN ROW_NUMBER() OVER (PARTITION BY userid, bookid ORDER BY bookid) = 1 
            THEN SUM(pagenumber) OVER (PARTITION BY userid, bookid) 
        END AS countrow
FROM    usertable;

从视图中选择:

SELECT * FROM vwMyView;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在更新语句中使用表值函数

来自分类Dev

在MongoDB更新语句中使用变量

来自分类Dev

tsql-在更新语句中使用变量

来自分类Dev

在 where 子句中使用子查询更新语句

来自分类Dev

在SQL Server中的case语句中使用Row_Number()

来自分类Dev

ROW_NUMBER()ORDER BY,不能在同一SELECT语句中使用列

来自分类Dev

如何在UPDATE子句中使用ROW_NUMBER()?

来自分类Dev

在 SQL Server 的 WHERE 子句中使用 ROW_NUMBER()

来自分类Dev

使用 PL/SQL 在 Oracle 中使用 Excel 表中的列作为更新语句中的输入

来自分类Dev

在更新语句中使用强制转换时,mysql错误1292

来自分类Dev

在from子句中使用不同表的SQL更新语句

来自分类Dev

如何在更新语句中使用SQL变量递增

来自分类Dev

如何在SQL Server更新语句中使用MAX函数

来自分类Dev

在SQL更新语句中使用子字符串

来自分类Dev

在更新语句中添加If

来自分类Dev

更新语句中的错误

来自分类Dev

更新语句中的案例

来自分类Dev

如何在SQL中使用ROW_NUMBER()更新列

来自分类Dev

Linq在选择新语句中使用变量作为列名

来自分类Dev

Linq在选择新语句中使用变量作为列名

来自分类Dev

如何在 DB2 更新语句中使用内部连接和 case 表达式?

来自分类Dev

在where子句中使用ROW_NUMBER()OVER(PARTITION BY ...)选择stmt

来自分类Dev

在where子句中使用ROW_NUMBER()OVER(PARTITION BY ...)选择stmt

来自分类Dev

更新语句中的类型转换失败

来自分类Dev

在更新语句中添加前缀

来自分类Dev

如何连接更新语句中的列

来自分类Dev

如何在SQLDataAdapter中使用更新语句

来自分类Dev

如何在SQLDataAdapter中使用更新语句

来自分类Dev

如何在Android中使用更新语句

Related 相关文章

热门标签

归档