Группировка SQL с использованием двух ключей

#sql #hadoop #impala

#sql #hadoop #impala

Вопрос:

Я хочу написать запрос для группы по ID1, ID2, но возвращать идентификаторы только там, где для ID2 существует > 1 уникального ID1.

У меня есть такие данные:

  ------ ------ 
|  ID1 |  ID2 |
 ------ ------ 
|1     |A     |
 ------ ------ 
|1     |A     |
 ------ ------ 
|2     |A     |
 ------ ------ 
|3     |B     |
 ------ ------ 
|3     |B     |
 ------ ------ 
|4     |C     |
 ------ ------ 
|5     |C     | 
 ------ ------ 
|6     |D     |
 ------ ------ 
|6     |D     |
 ------ ------ 
|7     |E     |
 ------ ------ 
  

В идеале, мой вывод будет выглядеть следующим образом:

  ------ 
| ID2  |
 ------ 
|A     |
 ------ 
|C     |
 ------ 
  

Обратите внимание, что существует > 1 запись для ID2 = ‘B’ или ID2 = ‘D’, но они имеют одинаковый ID1. В примере A, даже при наличии повторяющихся значений ID1 «1», я все равно хотел бы выбрать его, потому что есть другой уникальный ID1 — «2».

Ответ №1:

Вы можете использовать COUNT(DISTINCT ID1) в having предложении как следующее:

 SELECT ID2
FROM tbl
GROUP BY sID2
HAVING COUNT(DISTINCT ID1) > 1
  

Ответ №2:

 select ID2
from t
group by ID2
having count(distinct ID1) > 1
  

Не уверен, есть ли у Impala count(distinct) , но это довольно стандартно, поэтому я собираюсь предположить это. having Предложение применяется после group by , поэтому оно сохраняет только те данные, которые вы ищете.

Ответ №3:

Я бы рекомендовал:

 select ID2
from t
group by ID2
having min(ID1) <> max(ID1);
  

Я думаю, что min() и max() имеют гораздо лучшие характеристики производительности, чем count(distinct) .

На самом деле, я ожидал бы, что это сработает лучше, чем count(distinct) :

 select id2
from (select distinct id1, id2
      from t
     ) x
group by id2
having count(*) > 1;