Как указать пункт Где для каждой группы из группы по - PullRequest
0 голосов
/ 07 мая 2019

Мне нужно сгруппировать все данные по столбцу «Ico» и из каждой группы (125, 130, 140) выбрать только те, для которых столбец «ValidTo» не равен NULL.

У меня есть набор данных:

Id  Ico  ValidTo
1   125   NULL
2   125   7.5.2019
3   125   7.5.2019
4   130   20.5.2019
5   130   21.5.2019
6   140   NULL
7   140   NULL

Таким образом, результат будет

Ico    ValidTo
130   21.5.2019

Результат не нужно группировать и не нужно показывать только максимальную допустимую дату (но было бы неплохо)

Производительность не является проблемой, запрос предназначен только для тестирования, чтобы проверить, правильно ли выполняет несколько моих запросов LINQ.

Есть предложения, как этого добиться? Спасибо.

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Один из способов сделать это - сгруппировать по столбцу ico и проверить, равно ли количество строк в этой группе сумме ненулевых строк.

SELECT ico, MAX(validto)
FROM foo t1
GROUP BY ico
HAVING SUM(CASE WHEN validto IS NULL THEN 0 ELSE 1 END) = COUNT(id)
1 голос
/ 07 мая 2019

Просто используйте not exists

 select * from your_data t1
 where not exists (
    select 1
    from your_data t2
    where t1.ico = t2.ico and t2.validto is null
 )

Это решение не делает группу данных.Если вы действительно заинтересованы в наибольшем количестве групп, вы можете использовать row_number() оконные функции

select *
from (
     select *,
            row_number() over (partition by t1.ico order by validto desc) rn
     from your_data t1
     where not exists (
        select 1
        from your_data t2
        where t1.ico = t2.ico and t2.validto is null
     )
) t
where t.rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...