gpt4 book ai didi

sql - 每组更新单行

转载 作者:行者123 更新时间:2023-12-04 04:47:43 24 4
gpt4 key购买 nike

背景

我有一个临时表,其中包含的信息包括唯一的 rowID、OrderNumber 和 guestCount。此表中已存在 RowID 和 OrderNumber,我正在运行一个新查询来填充每个 orderNumber 缺失的 guestCount。然后我想用这些信息更新临时表。

示例

我目前拥有的看起来像这样,只有 RowID 是唯一的,这意味着可以有多个项目具有相同的 OrderNumber。

    RowID | OrderNumber | guestCount
1 | 30001 | 0
2 | 30002 | 0
3 | 30002 | 0
4 | 30003 | 0

我的查询返回下表,每个订单号只返回一个客人总数:
    OrderNumber | guestCount
30001 | 3
30002 | 10
30003 | 5

决赛 table 应如下所示:
    RowID | OrderNumber | guestCount
1 | 30001 | 3
2 | 30002 | 10
3 | 30002 | 0
4 | 30003 | 5

我只对每个 orderNumber 更新一个(无关紧要)条目感兴趣,但我当前的逻辑导致错误:
UPDATE temp
SET temp.guestCount = cc.guestCount
FROM( SELECT OrderNumber, guestCount
FROM (SELECT OrderNumber, guestCount, RowID = MIN(RowID)
FROM #tempTable
GROUP BY RowID, OrderNumber, guestCount) t)temp
INNER JOIN queryTable q ON temp.OrderNumber = q.OrderNumber

我不确定这个逻辑是否是一种有效的方法,但我知道我在更新中遇到错误,因为我使用的是聚合函数以及 GROUP 函数。有没有办法以不同的方式进行此操作?

最佳答案

您可以使用 row_number() 定义要更新的行在 CTE 中。这标识了组中用于更新的第一行:

with toupdate as (
select tt.*, row_number() over (partition by OrderNumber order by id) as seqnum
from #tempTable tt
)
UPDATE toupdate
SET toupdate.guestCount = q.guestCount
FROM toupdate
INNER JOIN queryTable q
ON temp.OrderNumber = q.OrderNumber
where toupdate.seqnum = 1;

您查询的问题是 temp基于聚合子查询。这样的子查询是不可更新的,因为它与原始查询的行没有 1-1 关系。将 CTE 与 row_number() 一起使用是可更新的。此外,您的 set语句使用表别名 cc未在查询中定义。

关于sql - 每组更新单行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17931760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com