postgresql - 数据除以月份

时间:2017-05-26 20:30:53

标签: sql postgresql postgresql-9.1 postgresql-9.3 postgresql-9.2

我有以下表格

enter image description hereenter image description here

我收到每月的user_id计数,其中注册日期和登录日期应该不同。例如 : enter image description here

但是,我需要像以下示例那样收到唯一身份用户的数量:

enter image description here

其中黄色细胞是每月的登记计数。其他数据是unique_user,在接下来的几个月登录,与注册不同。

例如,user_ID 104在3月份进行了注册,并且必须在3月,4月和5月登录。我需要在3月之后看到登录并除以月份

作为结论,我需要查看注册月份后几个月内登录的所有唯一用户。

registration table      
User_ID month   registration_date 
101 dec 12.12.2016
102 dec 1.12.2016
103 feb 2.2.2017
104 mar 14.3.2017
105 mar 14.3.2017
106 apr 5.4.2017
107 may 15.5.2017
108 may 17.5.2017
109 may 18.5.2017
login table     
user_id month   login_date
101 dec 12.12.2016
101 jan 1.1.2107
103 apr 1.4.2017
101 may 1.5.2017
104 mar 14.3.2017
104 mar 15.3.2017
104 apr 1.4.2017
104 may 5.5.2017
105 may 15.5.2017

1 个答案:

答案 0 :(得分:1)

如果我理解你,你需要写下以下内容来获得你需要的东西:

SELECT COUNT(*) cnt, reg.month reg_month, reg.month log_month
FROM (
  SELECT DISTINCT ON (user_id, month) month
  FROM registration_table
) reg 
GROUP BY reg.month
UNION ALL
SELECT COUNT(*) cnt, reg_month, log_month
FROM (
  SELECT reg.month reg_month, log.month log_month FROM (
    SELECT DISTINCT ON (user_id, month) user_id, month
    FROM registration_table
  ) reg
  JOIN (
    SELECT DISTINCT ON (user_id, month) user_id, month
    FROM login_table
  ) log ON log.user_id = reg.user_id AND log.month != reg.month
) sub
GROUP BY reg_month, log_month
  1. 首先,您应该为每个单元格填充0表值,因为该查询不会遍历每个月。
  2. 然后只执行查询,并为每个单元格(reg_month,log_month)填充相应的cnt值。
  3. 我为您创建了以下sqlfiddle example。它会根据您的输入/输出示例填充表格。

    只是几个笔记。

    • 您的表格数据应该有效。例如。没有已注册用户的登录数据。
    • 不包括年度处理。