Хранить нулевые записи, только если нет других - PullRequest
0 голосов
/ 17 октября 2019

Учитывая приведенную ниже таблицу, как я могу написать запрос, в котором я сохраняю данные для каждой категории и кода, только записи с нулем для "product from", если нет записи со значением для "product from"?

> Category | Code | Product From | Product To
> :--------|------|--------------|----------
> Sports   |  A   |     ProdA    |    ProdB
> Sports   |  A   |     NULL     |    ProdB
> Sports   |  A   |     ProdX    |    ProdB
> Sports   |  B   |     NULL     |    ProdB
> Sports   |  C   |     ProdC    |    ProdD
> Sports   |  C   |     NULL     |    ProdD

Поскольку для кода A существует два «продукта из» для ProdB, строка с NULL в качестве «Продукта из» должна быть удалена. Для кода C то же самое происходит, но для кода B следует сохранить ProdB, поскольку для него нет «Product From».

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

> Category | Code | Product From | Product To
> :--------|------|--------------|----------
> Sports   |  A   |     ProdA    |    ProdB
> Sports   |  A   |     ProdX    |    ProdB
> Sports   |  B   |     NULL     |    ProdB
> Sports   |  C   |     ProdC    |    ProdD

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Еще один вариант - использовать WITH TIES.

Пример

Select top 1 with ties *
 From  mytable
 Order by row_number() over (Partition by Category,Code,Product_To Order by Product_From desc)

Возвращает

Category    Code    Product_From    Product_To
Sports      A       ProdA           ProdB
Sports      B       NULL            ProdB
Sports      C       ProdC           ProdD
0 голосов
/ 17 октября 2019

Вы можете использовать оконную функцию в подзапросе, чтобы проверить, являются ли все записи нулевыми в группах записей, имеющих одинаковый code, и применить логику во внешнем запросе:

select category, code, product_from, product_to
from (
    select
        t.*
        max(product_from) over(partition by code) max_product_from
    from mytable t
) x 
where 
    product_from is not null
    or max_product_from is null

Если всеproduct_from s внутри раздела - null, окно max возвращает null.

Демонстрация на DB Fiddle :

category | code | product_from | product_to
:------- | :--- | :----------- | :---------
Sports   | A    | ProdA        | ProdB     
Sports   | B    | <em>null</em>         | ProdB     
Sports   | C    | ProdC        | ProdD     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...