首页 文章

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

提问于
浏览
1

-------------------------
  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 回答

  • 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')
    
  • 1

    其他答案的复杂性让我想知道我是否遗漏了一些东西,但这不应该只是你需要的吗?

    SELECT DATE_FORMAT(date, '%Y-%m') AS date_period, COUNT(DISTINCT user_id, date) AS c 
    FROM stats 
    GROUP by date_period
    
  • 0

    这对我有用:

    SELECT 
    DATE_FORMAT(date, '%Y-%m') AS 'sum_month',
    user_id,
    COUNT(DISTINCT user_id,date) AS 'Count'
    FROM test
    GROUP BY sum_month,user_id;
    

    希望它能帮到你 .

  • 2

    标准的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 ??
    

    我想查询性能可能会从汇总的总结中受益 . 你必须亲自尝试一下 .

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

相关问题