Обновить предыдущие строки на основе значения следующей строки - PullRequest
1 голос
/ 17 апреля 2019

Мне нужно обновить строки NULL значением 'FULL', если в последующих строках есть значение 'FULL', учитывая, что они находятся в одной группе (по минутам) и порядку (по месяцам и годам).

Вот пример таблицы

min   month_no   year  remarks
001     1       2019   FULL
001     2       2019   NULL
001     3       2019   FULL
002     1       2019   NULL
002     2       2019   NULL
002     3       2019   FULL
003     1       2019   NULL
003     2       2019   FULL
003     3       2019   NULL

Я попробовал приведенный ниже код, но он просто копирует следующее значение строки без учета группировки.

select 
         min
        ,month_no
        ,year
        ,remarks
        LEAD(remarks) OVER (ORDER BY min, month_no, year) NextValue
from [table]
order by month_no, year

Вот мой ожидаемый результат:


    min   month_no  year remarks  newremarks
    001     1       2019   FULL     FULL
    001     2       2019   NULL     FULL
    001     3       2019   FULL     FULL
    002     1       2019   NULL     FULL
    002     2       2019   NULL     FULL
    002     3       2019   FULL     FULL
    003     1       2019   NULL     FULL
    003     2       2019   FULL     FULL
    003     3       2019   NULL     NULL

Значения NULL для min 001 и 002 равны 'FULL' в столбце newremarks, поскольку в последующих строках есть значение с 'FULL'.

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Если я вас правильно понимаю, этого можно достичь с помощью простых оконных функций с PARTITION и ORDER BY и агрегата, такого как MIN или MAX. Вы не можете использовать LEAD, потому что вы смотрите на все последующие строки в группе, а не только на следующую, следующую сразу:

select mi,month_no,year,remarks
     , newremarks =
       max(remarks) over (partition by mi order by month_no desc ,year desc)
from foo
order by mi,month_no,year;
GO
mi  | month_no | year | remarks | newremarks
:-- | -------: | ---: | :------ | :---------
001 |        1 | 2019 | FULL    | FULL      
001 |        2 | 2019 | <em>null</em>    | FULL      
001 |        3 | 2019 | FULL    | FULL      
002 |        1 | 2019 | <em>null</em>    | FULL      
002 |        2 | 2019 | <em>null</em>    | FULL      
002 |        3 | 2019 | FULL    | FULL      
003 |        1 | 2019 | <em>null</em>    | FULL      
003 |        2 | 2019 | FULL    | FULL      
003 |        3 | 2019 | <em>null</em>    | <em>null</em>      

дБ <> скрипка здесь

0 голосов
/ 17 апреля 2019

Попробуйте

;WITH CTE([min], month_no, [year], remarks)
AS
( 
SELECT 001, 1, 2019, 'FULL'     UNION ALL
SELECT 001, 2, 2019, NULL       UNION ALL
SELECT 001, 3, 2019, 'FULL'     UNION ALL
SELECT 002, 1, 2019, NULL       UNION ALL
SELECT 002, 2, 2019, NULL       UNION ALL
SELECT 002, 3, 2019, 'FULL'     UNION ALL
SELECT 003, 1, 2019, NULL       UNION ALL
SELECT 003, 2, 2019, 'FULL' UNION ALL
SELECT 003, 3, 2019, NULL
)
SELECT  [min], 
        month_no, 
        [year],
         LEAD(NewRemarks,1)OVER(ORDER BY [MIn]) AS NewRemarks 
FROM
(
SELECT  [min], 
        month_no,
        [year],
        Remarks,
        CASE WHEN Remarks IS NOT NULL THEN Remarks 
        ELSE
           (SELECT Top 1 Remarks 
            FROM CTe i
            WHERE  i.[year] = o.[year]              
            )END AS NewRemarks 
FROM CTE o
)dt

Результат

min month_no    year    NewRemarks
----------------------------------
1       2       2019      FULL
1       3       2019      FULL
1       1       2019      FULL
2       1       2019      FULL
2       2       2019      FULL
2       3       2019      FULL
3       2       2019      FULL
3       3       2019      FULL
3       1       2019      NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...