2013-09-27 37 views
1

更新使用具有一組子查詢多個值我有見下表:SQL:如何通過

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的更新。

更新後所需的表:

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 

Select sum(availtime)/count(availtime) 
from table 
group by row_date,logid,Interval; 

給我,我求值..但我不能更新avail_distribution列我打算的方式。

+1

爲什麼你需要更新表?所以每次數據更改時都可以不斷更新它?爲什麼不只是在查詢時計算分佈,那麼您不必執行更新,您不需要那些浪費的列,並且結果始終保證爲最新? –

回答

2

使用CTE(Common Table Expression)可讓您在執行實際更新之前輕鬆執行所需的任何分組/邏輯。

;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 
0

這可能有效。

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

更新此數據的另一種方式......

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