Считать в месяц, если уникально

Я пытаюсь получить SQL-запрос для подсчета уникальных personid за месяц, является «вернувшимся» посетителем, если у него также нет записи «Новый» за месяц.

month |    personid   | visitstat
---------------------------------
January     john          new
January     john          returning
January     Bill          returning

Таким образом, в запросе, который я ищу, должно быть подсчитано количество для каждого уникального персонального идентификатора, который имеет «возвращение», если только «новый» не существует и для этого персонального идентификатора - в этом случае возвращается count, равное 1 для

January Bill returning

потому что Джон новичок в этом месяце.

Запрос, который я пробовал,

SELECT COUNT(distinct personid) as count FROM visit_info WHERE visitstat = 'Returning' GROUP BY MONTH(date) ORDER BY date

К сожалению, это считается «Вернувшимся», даже если для человека в этом месяце существует «Новая» запись.

Заранее спасибо, надеюсь, я объяснил это достаточно ясно.

Образ базы данных SQL

Диаграмма данных

Это не так уж и много данных, не так ли?

Strawberry 09.08.2018 23:06

Это больше, чем то, что я включил, но я подумал, что включить сюда будет большой беспорядок.

stark1134 09.08.2018 23:12
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
3
2
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы уже сами написали «волшебное» слово «существует». Вы можете использовать именно это, NOT EXISTS и коррелированный подзапрос.

SELECT count(DISTINCT vi1.personid) count
       FROM visit_info vi1
       WHERE vi1.visitstat = 'Returning'
             AND NOT EXISTS (SELECT *
                                    FROM visit_info vi2
                                    WHERE vi2.personid = vi1.personid
                                          AND year(vi2.date) = year(vi1.date)
                                          AND month(vi2.date) = month(vi1.date)
                                          AND vi2.visitstat = 'New')
       GROUP BY year(vi1.date),
                month(vi1.date)
       ORDER BY year(vi1.date),
                month(vi1.date);

Я также рекомендую включать год в выражение GROUP BY, поскольку в противном случае вы можете получить неожиданные результаты, если данные охватывают более одного года. Также используйте только выражения, включенные в предложение GROUP BY или переданные в функцию агрегирования в предложении ORDER BY. MySQL, в отличие от практически любой другой СУБД, может принять это иначе, но также может давать странные результаты.

Этот работает так же, как и другой. Есть ли у них способ сделать так, чтобы строки, из которых он не извлекает значения, заполнялись как нулевые? Спасибо!!

stark1134 10.08.2018 00:29

Я также столкнулся с одним из тех же сценариев, с которыми имел дело с базой данных. Возможный способ, которым я это сделал, заключался в использовании group by с предложением Have и подзапросом.

Другие вопросы по теме