Mysql 如果唯一,则每月计数
我正在尝试获取一个SQL查询,以统计当月唯一的personid,如果他们没有当月的“New”记录,则是“Returning”访问者Mysql 如果唯一,则每月计数,mysql,sql,phpmyadmin,Mysql,Sql,Phpmyadmin,我正在尝试获取一个SQL查询,以统计当月唯一的personid,如果他们没有当月的“New”记录,则是“Returning”访问者 month | personid | visitstat --------------------------------- January john new January john returning January Bill returning 因此,我要查找的查询应该为
month | personid | visitstat
---------------------------------
January john new
January john returning
January Bill returning
因此,我要查找的查询应该为每个具有“returning”的唯一personid获取计数,除非该personid也存在“new”——在本例中,为每个personid返回一个count
1月份退票
因为约翰这个月是新来的
我试过的问题是
选择COUNT(不同的personid)作为访问信息中的COUNT,其中visitstat='Returning'GROUP BY MONTH(date)ORDER BY date
不幸的是,即使该人在该月有“新”记录,这也算作“返回”
提前谢谢,希望我解释得足够清楚
你自己已经写下了“存在”这个神奇的词。您可以准确地使用它,一个不存在
和一个相关子查询
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不同,可能会接受其他DBMS,但也可能产生奇怪的结果。我也遇到了与处理数据库相同的情况。我可能使用的方法是将GROUPBY与having子句和子查询一起使用 它不是一个很大的数据集,是吗?它比我包含的要多,但我想如果包含在这里,会是一团混乱。这一个有效,另一个也有效。它们是否无论如何都要使其不从中提取值的行填充为null?谢谢