Mysql:仅在日期不同时计算每月不同的user_ids

时间:2018-02-08 16:43:52

标签: mysql sql database mysql-5.7 mysql-5.6

-------------------------
  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(避免在同一天重复记录)

5 个答案:

答案 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过滤数据