繁体   English   中英

根据 CTE 结果更新表列

[英]Update table column based on CTE result

我有下面显示的代码,我想更新我的原始表以反映此查询的结果。 我希望每条记录的Route_type列根据与每条记录关联的代码使用查询中Route_type列中的相应值进行更新。 例如,所有code=1的记录都应该根据查询将Route_Type更新为“Other”。

With Route_Number_CTE (Code,Year_and_Week, Route_Count) As
(
    Select 
        Code, Year_and_Week, Count(Route) AS Route_Count
    From 
        Deliveries
    Group by
        Code, Year_and_Week
)
select 
    d.Code, 
    min(r.Route_Count) As Min_Count,
    max(r.Route_Count) As Max_Count,
    (case
        When max(r.Route_Count) = 1 then 'One'
        When max(r.Route_Count) <= 3 AND min(r.Route_Count) > 1 then 'Three or less'
        When min(r.Route_Count) > 4 then 'Four or More'
        Else 'Other'
     End) As Route_Type
From 
    Deliveries as d
inner join 
    Route_Number_CTE as r on d.Code = r.Code
Group By 
    d.Code;

查询结果:

Code  Min_Count  Max_Count   Route_Type
----------------------------------------
1     1          4           Other
2     1          2           Three or less
3     3          3           Three or less

交货:

Code   Route   Route_Type
-------------------------
1      A
1      C
1      D
2      A
2      C    
2      B
3      A
3      C
3      D

我认为您可以使用 window 函数和可更新的 cte。 这更简单,并且应该更有效,因为它避免了聚合和连接的需要:

with cte as (
    select route_type, max(cnt) over(partition by code) max_cnt
    from (
        select d.*, count(*) over(partition by code, year_and_week) cnt
        from deliveries d
    ) d
)
update cte
set route_type = case
    when max_cnt =  1 then 'One'
    when max_cnt <= 3 then 'Three or less'
    when max_cnt >  4 then 'Four or more'
end

我通过从第二个 Select 语句创建第二个 CTE 并使用更新查询的结果来解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM