首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL:如何使用具有以下组的子查询更新多个值

SQL:如何使用具有以下组的子查询更新多个值
EN

Stack Overflow用户
提问于 2013-09-27 15:13:06
回答 3查看 2.5K关注 0票数 1

我有下表:

代码语言:javascript
复制
row_date    logid   type    Interval   availtime    avail_distribution
9/25/2013    122     4       850         640            NULL
9/25/2013    122     5       850         0              NULL
9/25/2013    122     7       850         0              NULL
9/26/2013    122     4       850         500            NULL
9/26/2013    122     5       850         0              NULL
9/26/2013    122     7       850         0              NULL

这里,每个avail_distribution都要按照availtime, group by row_date,logid and Interval的平均值进行更新。

更新后所需的表:

代码语言:javascript
复制
row_date    logid   type    Interval   availtime    avail_distribution
9/25/2013   122      4        850        640            213.3333
9/25/2013   122      5        850        0              213.3333
9/25/2013   122      7        850        0              213.3333
9/26/2013   122      4        850        500            167.66667
9/26/2013   122      5        850        0              167.66667
9/26/2013   122      7       850         0              167.66667
代码语言:javascript
复制
Select sum(availtime)/count(availtime) 
 from table 
 group by row_date,logid,Interval; 

给我我所追求的价值。但是,我无法按照我想要的方式更新avail_distribution列。

EN

回答 3

Stack Overflow用户

发布于 2013-09-27 15:19:10

使用CTE (公共表表达式)将允许您在执行实际更新之前轻松地执行所需的任何分组/逻辑。

代码语言:javascript
复制
;WITH cte_update as (
    Select 
        row_date,
        logid,
        Interval,
        sum(availtime)/count(availtime) as avail_dist
    from 
        table 
    group by 
        row_date,
        logid,
        Interval )

update t
set 
    t.avail_distribution = cte.avail_dist
from 
    table as t
    inner join cte_update as cte 
        on t.row_date = cte.row_date 
        and t.logid = cte.logid 
        and t.interval = cte.interval
票数 2
EN

Stack Overflow用户

发布于 2013-09-27 15:19:57

这也许能行。

代码语言:javascript
复制
UPDATE a
SET a.avail_distribution = b.val
FROM TableName a INNER JOIN
    ( Select  row_date,logid,Interval,
            sum(availtime)/count(availtime) val
    from  [Table] group by row_date,logid,Interval
    ) b ON a.row_date = b.row_date AND
        a.logid = b.logid AND
        a.Interval = c.Interval

但是你为什么要像这样存储数据呢?从长远来看,您将始终执行此脚本来更新该列,这会带来一定的开销。

票数 0
EN

Stack Overflow用户

发布于 2013-09-27 15:32:03

另一种更新数据的方法.

代码语言:javascript
复制
Declare @Data Table
(
    row_date datetime,
    logid int,
    type int,
    Interval int,
    availtime float,
    avail_distribution float
);

Insert Into @Data(row_date,logid,type,Interval,availtime) Values 
('9/25/2013', 122, 4, 850, 640),
('9/25/2013', 122, 5, 850, 0),
('9/25/2013', 122, 7, 850, 0),
('9/26/2013', 122, 4, 850, 500),
('9/26/2013', 122, 5, 850, 0),
('9/26/2013', 122, 7, 850, 0);


;WITH CTE
as
(
    Select *, Avg(availtime) Over (partition by row_date,logid,Interval) 
    as value_of_avail_distribution from @Data
)
Update CTE Set avail_distribution = value_of_avail_distribution

select * from @Data
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19054239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档