Обновить столбец таблицы на основе результата CTE - PullRequest
0 голосов
/ 08 мая 2020

У меня есть код, показанный ниже, и я хочу обновить исходную таблицу, чтобы отразить результаты этого запроса. Я хочу, чтобы столбец 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

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Я думаю, вы могли бы использовать оконные функции и обновляемый 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
0 голосов
/ 08 мая 2020

Я понял это, просто создав второй CTE из второго оператора Select и используя запрос на обновление с результатом.

...