Группировать SQL по нескольким неуникальным вхождениям

#sql #sqlite

#sql #sqlite

Вопрос:

У меня есть таблица, которая выглядит следующим образом:

 CREATE TABLE tab (name TEXT, num INTEGER, hash TEXT)
  

Мне нужно получить строку, возвращаемую для каждого уникального хэша, для которого выполняются следующие условия:

  1. Хэш встречается более одного раза
  2. С хэшем связано более одного значения «num»

В качестве примера предположим, что у меня есть эта таблица:

 name | num  | hash
----- ------ -------
  A  |  1   | 123
  B  |  1   | 123
  C  |  2   | 456
  D  |  3   | 456
  E  |  4   | 789
  F  |  4   | 789
  G  |  5   | 789
  

Я хочу, чтобы возвращалось следующее:

 hash
----
 456
 789
  

Я не хочу «123», потому что этот хэш встречается однозначно с num = 1.

Я пробовал это:

 SELECT * 
FROM tab
GROUP BY hash
HAVING COUNT(hash) > 1 AND COUNT(num) > 1;
  

Но это не работает, потому что это не отделяет hash столбец от num column. Я пробовал несколько вариантов, таких как группировать по обоим столбцам, но, похоже, ничего не работает.

Ответ №1:

Я думаю, это делает то, что вы хотите:

 SELECT hash
FROM tab
GROUP BY hash
HAVING COUNT(*) > 1 AND COUNT(DISTINCT num) > 1;
  

Тем не менее, я был бы склонен написать:

 SELECT hash
FROM tab
GROUP BY hash
HAVING COUNT(*) > 1 AND
       MIN(num) <> MAX(num);
  

Примечание: Не используйте SELECT * with GROUP BY .

Ответ №2:

Первое условие:

Хэш встречается более одного раза

не требуется, поскольку он полностью покрывается 2-м:

С хэшем связано более одного значения «num»

Вы можете сделать это с помощью EXISTS:

 select distinct t.hash
from tab t
where exists (
  select 1 from tab 
  where hash = t.hash and num <> t.num
) 
  

Смотрите демонстрацию