如何基于先前行的数据对表进行分组并获取行的结果

时间:2014-11-20 14:24:27

标签: mysql sql

我有一个查找表,其中涉及与这些日期相关的日期和人员:

id, user_id,date
1,1,2014-11-01
2,2,2014-11-01
3,1,2014-11-02
4,3,2014-11-02
5,1,2014-11-03

我可以按日期(日期)对这些进行分组:

  SELECT    DATE_FORMAT(
                MIN(date),
                '%Y/%m/%d 00:00:00 GMT-0'
            ) AS date,
            COUNT(*) as count
    FROM    user_x_date
GROUP BY    ROUND(UNIX_TIMESTAMP(created_at) / 43200)

但是,如何才能获得之前已经出现的独特用户数量?例如,这将是一个有效的结果:

unique, non-unique, date
2,0,2014-11-01
1,1,2014-11-02
0,1,2014-11-03

这可能不必依赖脚本语言来跟踪这些数据吗?

2 个答案:

答案 0 :(得分:0)

我认为这个查询会做你想要的,至少它似乎适用于有限的样本数据。

我们的想法是使用相关的子查询来检查user_id是否发生在当前行日期之前的某个日期,然后执行一些基本算法来确定每个日期的唯一/非唯一用户数。

请试一试。

select 
  sum(u) - sum(n) as "unique", 
  sum(n) as "non-unique", 
  date 
from (
  select 
    date, 
    count(user_id) u, 
    case when exists (
      select 1 
      from Table1 i
      where i.user_id = o.user_id 
        and i.date < o.date
    ) then 1 else 0 
    end n
  from Table1 o
  group by date, user_id
) q
group by date
order by date;

Sample SQL Fiddle

我没有在示例小提琴中包含id列,因为它不需要(或用于)产生结果并且不会改变任何内容。

答案 1 :(得分:0)

这是相关问题:&#34;但是,如何获得以前已经显示的唯一身份用户数?&#34;

计算一个人第一次出现,然后将其用于聚合:

SELECT date, count(*) as FirstVisit
FROM (SELECT user_id, MIN(date) as date
      FROM user_x_date
      GROUP BY user_id
     ) x
GROUP BY date;

然后我将其用作另一个聚合的子查询:

SELECT v.date, v.NumVisits, COALESCE(fv.FirstVisit, 0) as NumFirstVisit
FROM (SELECT date, count(*) as NumVisits
      FROM user_x_date
      GROUP BY date
     ) v LEFT JOIN
     (SELECT date, count(*) as FirstVisit
      FROM (SELECT user_id, MIN(date) as date
            FROM user_x_date
            GROUP BY user_id
           ) x
      GROUP BY date
     ) fv
     ON v.date = fv.date;