SQL Server: как обновить столбец значением, которое находится в этом столбце, если другой номер в другом столбце равен> 1 - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть таблица со следующими данными:

Part    Comp   level  item_nbr
-------------------------------
abc     ab      1      1
null    cd      2      2
null    ef      3      3
cde     gh      1      4
null    ij      2      5
null    kl      3      6
null    mn      4      7

Я хотел бы обновить нулевые значения до значения на каждом уровне 1, поэтому каждый уровень, который> 1, обновляется со значением первого уровня.

Part    Comp   level   
---------------------
abc     ab      1     
abc     cd      2  
abc     ef      3  
cde     gh      1    
cde     ij      2  
cde     kl      3  
cde     mn      4 

Я не знаю, как этого добиться на очень большом наборе данных.Любая помощь будет принята с благодарностью!

Чтобы объяснить по-другому, уровень детализации
abc 1
2
3
Затем следующая строка заполняется другой частью efg 1 2 2

и т. Д.

Дополнительные пояснения:

Мне нужно, чтобы строка «abc» была заполнена строкой «abc», а поля столбца нижеявляются нулевымиВ следующей строке есть строка efg, а следующие поля столбцов ниже равны нулю, опять же, эти поля должны быть заполнены значением «efg» и так далее.

Поле уровня = 1 всегда будет иметь номер детали, но все остальные уровни сообщают вплоть до детали уровня 1, поэтому должны заполняться одинаково.И повторите.

Надеюсь, это имеет смысл.

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Вы можете обновить его, используя временную таблицу в соответствии с заданным сценарием. Я думал, что item_nbr уникален в строке. Надеюсь, это поможет

SELECT  *
INTO    #TEMP
FROM    URTablehere

DECLARE @PRev VARCHAR(MAX)
WHILE ( SELECT  COUNT(*)
        FROM    URTablehere
      ) > 0
    BEGIN
        DECLARE @ID INT 
        DECLARE @Part VARCHAR(MAX)
        DECLARE @Num INT 


        SELECT TOP ( 1 )
                @ID = level ,
                @Part = Part ,
                @Num = item_nbr
        FROM    #TEMP
        IF ( @ID = 1 )
            BEGIN 
                SELECT  @PRev = @Part
            END 

        IF ( @ID > 1
             AND @Part IS NULL
           )
            BEGIN

                UPDATE  URTablehere
                SET     Part = @PRev
                WHERE   item_nbr = @Num

            END 

        DELETE 
        FROM    #TEMP WHERE item_nbr=@Num




    END 
0 голосов
/ 05 декабря 2018

Используйте обновляемый CTE с оконными функциями:

with toupdate as (
      select t.*,
             max(part) over (partition by itm_nbr_not_null) as new_part
      from (select t.*,
                   max(case when part is not null then item_nbr end) over (order by item_nbr) as itm_nbr_not_null
            from t
           ) t
     )
update toupdate
    set part = new_part
    where part is null;

Вы можете запустить CTE, чтобы увидеть, что происходит.

0 голосов
/ 05 декабря 2018

хорошо, из вашего вопроса, что я понимаю, вам нужно обновлять значение пустого столбца, пока вы не получите ненулевое значение.и вы хотите продолжить до последнего ряда таблицы.для этого сценария я создал хранимую процедуру, в которой я читаю значение каждой n-й ячейки, если оно равно нулю, меняя его с помощью пред.значение ячейки, когда ячейка не была нулевой.

Подход:

  1. создать временную таблицу / переменную таблицы.

  2. добавить дополнительный столбец, который в основном идентичен,что поможет ранжировать столбец.

  3. повторять цикл до достижения максимальной строки.

  4. в каждой итерации считывать значение ячейкидля i-й строки

    4.1, если он не равен NULL, поместите его во временную переменную.

    4.2, замените / обновите значение i-й ячейки временной переменной

  5. продолжайте до тех пор, пока не дойдете до последней строки таблицы / табличной переменной.

посмотрите на мои следующие фрагменты:

create proc DemoPost
as
begin
declare @table table(serial_no int identity(1,1), name varchar(30), text varchar(30), level int)
insert @table
select Name, Text, Level from Demo
declare @max as int = (select max(serial_no) from @table)
--select @max
declare @i as int =0
declare @temp as varchar(30)
declare @text as varchar(30)

while @i < @max
begin   
    set @i = @i +1
    set @temp = (select name from @table where serial_no = @i)
    -- if @temp is not null, fetch its value, otherwise, update/replace it with 
    -- previously gotten not-null cell's value.
    if @temp is not null
    begin
        set @text = (select name from @table where serial_no = @i)
    end
    else
    begin
        update @table
        set name = @text where serial_no = @i 
    end
end

select name, text, level from @table
end
...