Определите строки в сводной таблице, которые имеют только 1 вхождение - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть агрегированная таблица, как показано ниже на картинке (вместе с кодом для ее получения).

Мне нужно найти номер Id, который встречается только один раз. Как я могу добиться этого на SQL сервере?

enter image description here

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Я думаю, что вы хотите посчитать, сколько id s появляется только один раз в результатах вашего существующего запроса, другими словами, сколько id s имеют только один отдельный NaicsCodeValue.

Один из вариантов - использовать оконные функции:

select count(*)
from (
    select 
        Id, 
        NaicsCodeValue, 
        max(...) max_emp,
        count(*) over(partition by id) cnt
    from ...
    group by Id, NaicsCodeValue
) t
where cnt = 1

Если вы хотите, чтобы все строки из исходного запроса:

select *
from (
    select 
        Id, 
        NaicsCodeValue, 
        max(...) max_emp,
        count(*) over(partition by id) cnt
    from ...
    group by Id, NaicsCodeValue
) t
where cnt = 1

Если вы просто хотите подсчитать, это также можно записать путем агрегирования по id и фильтрации по количеству различных NaicsCodeValue:

select count(*)
from (
    select 1 
    from ...
    group by Id
    having count(distinct NaicsCodeValue) = 1
) t 

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

0 голосов
/ 10 апреля 2020

Используйте подзапрос:

select count(*)
from (select . . .
      from . . .
      group by . . .
      having count(*) = 1
     ) x;

. . . для компонентов вашего запроса.

...