表
-------------------------
id | user_id | date
------------------------
1 1 2017-09-12
2 1 2017-09-12
3 1 2017-09-13
4 2 2017-09-14
5 2 2017-09-15
---------------------------
我想返回包含用户计数的月度记录。
SELECT DATE_FORMAT(date, '%Y-%m') AS date_period, COUNT(DISTINCT user_id) AS c
FROM stats GROUP by date_period
以上查询将2017-09的计数返回为2,但我希望每天只避免重复的user_id / date。
id | user_id | date
1 1 2017-09-12
2 1 2017-09-12
以上行应计为1,因为它是相同的用户和相同的日期
id | user_id | date
3 1 2017-09-13
以上记录是user_id => 1但不同的一天,所以应该计算。
id | user_id | date
4 2 2017-09-14
5 2 2017-09-15
User_id => 2在不同的日期有两行,所以它应该算作2
1 +1 + 2 = 4
计数结果应为4。
我遇到查询以返回每月user_id(避免在同一天重复记录)
答案 0 :(得分:3)
这对我有用:
Urecognized range input: [Timestamp('2018-02-02 00:00:00').., Timestamp('2018-02-03 00:00:00')]
希望它对你有所帮助。
答案 1 :(得分:1)
获取每个user_id,日期组合的不同行并执行每月计数。
SELECT DATE_FORMAT(date,'%Y-%m') AS date_period, COUNT(*) AS c
FROM (SELECT DISTINCT date,user_id FROM stats) t
GROUP BY DATE_FORMAT(date,'%Y-%m')
答案 2 :(得分:1)
其他答案的复杂性让我想知道我是否遗漏了一些东西,但这不应该只是你需要的吗?
SELECT DATE_FORMAT(date, '%Y-%m') AS date_period, COUNT(DISTINCT user_id, date) AS c
FROM stats
GROUP by date_period
答案 3 :(得分:0)
标准SQL方法将此作为两个计数级别:
select sum(dt_cnt) from
(select user_id, count(distinct date_period) as dt_cnt from stats group by user_id) agg_dts
--group by month ??
我认为查询性能可能会从汇总的总结中受益。你必须自己尝试一下。
答案 4 :(得分:0)
在SQL Server 2012上,所有这三个答案对我都没有用。所以我得到了以下解决方案
select id,userid,date1 from
(select distinct rankk,max(id) as id,max(userid) as userid,max(date1) as date1
from
(select rank() over (order by userid,date1) as rankk,* from stakflow)
as alias1
group by rankk)
as alias2
将rank函数与子查询结合使用,可以根据给定列中的repitition过滤数据