#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;