Группа SQL с помощью двух ключей - PullRequest
0 голосов
/ 08 марта 2019

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

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

+------+------+
|  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, несмотря на наличие дублирующихся значений «1» идентификатора ID1, я все же хотел бы выбрать его, поскольку существует другой уникальный идентификатор ID1 - «2».

Ответы [ 3 ]

0 голосов
/ 08 марта 2019
select ID2
from t
group by ID2
having count(distinct ID1) > 1

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

0 голосов
/ 08 марта 2019

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

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;
0 голосов
/ 08 марта 2019

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

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