SQL Query находит пользователей только с одним типом продукта - PullRequest
0 голосов
/ 12 сентября 2018

Я торжественно клянусь, что приложил все усилия, чтобы найти существующий вопрос, может я не уверен, как правильно его сформулировать.

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

| user_id | product |
|       1 |     A   |
|       1 |     B   | 
|       1 |     C   | 
|       2 |     B   | 
|       3 |     B   | 
|       3 |     C   | 
|       3 |     D   | 

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

Я пытался использовать select user_id, product from table group by 1,2 having count(user) < 2, но это не работает, а также select user_id, product from table group by 1,2 having count(*) < 2

Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Предложение group by не может принимать порядковые аргументы (как, например, предложение order by).При группировании по значению типа 1 вы фактически группируете по буквальному значению 1, которое будет одинаковым для любой строки в таблице и, таким образом, будет группировать все строкв таблице к одной группе.Поскольку во всей таблице более одного продукта, строки не возвращаются.

Вместо этого вы должны сгруппировать по user_id:

SELECT   user_id
FROM     mytable
GROUP BY user_id
HAVING   COUNT(*) = 1
0 голосов
/ 12 сентября 2018

Если вы хотите продукт, то выполните:

select user_id, max(product) as product
from table
group by user_id
having min(product) = max(product);

Предложение having также может быть:

having count(distinct product) = 1
0 голосов
/ 12 сентября 2018

Ваш having пункт хорош; проблема с вашим group by. Попробуйте это:

select user_id
, count(distinct product) NumberOfProducts 
from table 
group by user_id
having count(distinct product) = 1

Или вы могли бы сделать это; который ближе к вашему оригиналу:

select user_id
from table 
group by user_id 
having count(*) < 2
...