Предложения GROUP BY и WHERE в одном запросе - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь получить все строки, где состояния больше 1.

Мой стол:

user_id|state
--------------
1000000|Active
1000000|Created
1000001|Active
1000000|Deleted
1000002|Active
1000001|Created
1000003|Active

Мой запрос:

select user_id, count(state) from docs group by user_id order by count(state) desc;

Результат:

user_id | count(state)
1000000 |      3
1000001 |      2
1000002 |      1
1000003 |      1

Но мне нужно печатать только те значения, где число (состояние) больше 1

Я пытаюсь это сделать, но это не работает:

select user_id, count(state) from docs where count(state) > 1 group by user_id;

Мой пример: http://www.sqlfiddle.com/#!9/b2716b/2

Ответы [ 6 ]

3 голосов
/ 11 июня 2019

HAVING может отфильтровать ненужные для вас строки, когда применяется GROUP BY.Попробуйте следующий запрос для вашей цели.Предложение WHERE используется для фильтрации строк и применяется к каждой строке, тогда как предложение HAVING используется для фильтрации групп в SQL

SELECT user_id, 
COUNT(state) 
FROM docs 
GROUP BY user_id
HAVING  COUNT(state) > 1
ORDER BY COUNT(state) DESC;
.
2 голосов
/ 11 июня 2019

Вам, вероятно, нужно использовать предложение "has".

select user_id, count(state) 
from docs 
group by user_id 
having count(state) > 1
order by count(state) desc;
0 голосов
/ 11 июня 2019

выберите user_id, состояние из документов, где состояние = (выберите состояние из (выберите состояние, количество (состояние) 'count' из группы документов по состоянию, имеющему count (состояние)! = 1) в качестве временного значения, гдеtemp.state = Docs.state)

0 голосов
/ 11 июня 2019

Вы также можете использовать концепцию подзапроса.Вы можете узнать больше о подзапросе здесь .

Здесь, в следующем запросе, внутренний запрос будет извлекать счетчик состояния и соответствующий ему user_id, тогда как внешний запрос отфильтрует эти результаты.для отображения результатов, где количество> = 1.

 SELECT * FROM (select user_id, count(state) as count from docs group by user_id) WHERE count>1 order by count desc;
0 голосов
/ 11 июня 2019

Исходя из вашего кода;

select user_id, count(state) from docs group by user_id order by count(state) desc;
it will be easy and simple to modify. 

Попробуйте:

select user_id, count(state) from docs group by user_id where count(state) > 1 order by count(state) desc;

Это должно работать отлично и безупречно.Ваш отзыв поможет мне продолжить исследования.Удачи !!!

0 голосов
/ 11 июня 2019
select *
from (select user_id, count(state) as [count] 
      from docs
      group by user_id)
where count > 1
order by count(state) desc;

Должен сделать трюк

...