Подсчет количества различных значений из двух столбцов в sql - PullRequest
2 голосов
/ 26 апреля 2019

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

Я уже знаю один метод использования union all и последующего применения groupby к этой результирующей таблице.

Select Id,Brand1
into #Temp
from data
union all
Select Id,Brand2
from data

Select ID,Count(Distinct Brand1)
from #Temp
group by ID

То же самое мы можем сделать вбольшой запрос также использует только временную таблицу.

Пример таблицы

ID  Brand1  Brand2
1    A       B
1    B       C
2    D       A
2    A       D

Результирующая таблица

ID  Distinct_Count_Brand
1    3
2    2

Как видно из этого столбца Distinct_count_Brand Он считает уникальный счетчикBrand из двух столбцов Brand1 и Brand2.

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

Ответы [ 2 ]

3 голосов
/ 26 апреля 2019

Я не знаю причуд BigQuery, но, возможно, вы можете просто встроить запрос объединения:

SELECT ID, COUNT(DISTINCT Brand)
FROM
(
    SELECT ID, Brand1 AS Brand FROM data
    UNION ALL
    SELECT ID, Brand2 FROM data
) t
GROUP BY ID;
1 голос
/ 26 апреля 2019

В SQL Server я бы использовал:

Select b.id, count(distinct b.brand)
from data d cross apply
     (values (id, brand1), (id, brand2)) b(id, brand)
group by b.id;

Здесь - это дБ <> скрипка.

В BigQuery эквивалент будет выражаться как:

select t.id, count(distinct brand)
from t cross join
     unnest(array[brand1, brand2]) brand
group by t.id;

Вот запрос BQ, который демонстрирует, что это работает:

with t as (
      select 1 as id, 'A' as brand1, 'B' as brand2 union all
      select 1, 'B', 'C' union all
      select 2, 'D', 'A' union all
      select 2, 'A', 'D'
     )
select t.id, count(distinct brand)
from t cross join
     unnest(array[brand1, brand2]) brand
group by t.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...