每月计数(如果唯一)

ukdjmx9f  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(284)

我正在尝试让sql查询计数 personid 本月唯一的,是一个'返回'的访客,除非他们有'新'的记录,以及当月。

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

因此,我要查找的查询应该为每个具有“returning”的惟一personid获取一个计数,除非该personid也存在一个“new”——在本例中返回一个 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数据库映像
数据图表

nqwrtyyt

nqwrtyyt1#

我还面临着与处理数据库时相同的情况之一。可能的方法是使用GROUPBY with having子句和子查询。

js4nwp54

js4nwp542#

你已经自己写了“存在”这个词了。你可以用这个,一个 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,实际上与任何其他dbms相反,可能会接受它,但也可能产生奇怪的结果。

相关问题