【问题标题】:Postgresql count rows per date adding up每个日期的 Postgresql 计数行数相加
【发布时间】:2017-01-20 20:20:14
【问题描述】:

我正在尝试制作一个图表,我可以在其中跟踪不断增加的用户数量。

所以我写了一条SQL语句,搜索特定时期内新增的用户:

select distinct Createtime, count (user_id) as new_users 
from user 
where createtime between '2015-12-03 00:00:00' and CURRENT_DATE 
group by createtime 
order by createtime asc;

显示如下结果:

createtime|new_users
---------------------
2015-12-04|    1
2016-01-20|    1     
2016-02-03|    5
2016-02-04|    1

我想将结果相加以获得每个日期的当前用户数,因此结果应该更像这样:

createtime|new_users
---------------------
2015-12-04|    1
2016-01-20|    2     
2016-02-03|    7
2016-02-04|    8

是否有 SQL 语句或不同的方法来实现这一点?我希望你能帮我解决这个问题。

【问题讨论】:

  • 您是否在 createtime 列中存储日期或时间戳?
  • 我使用没有时区的时间戳

标签: sql postgresql count cumulative-sum


【解决方案1】:

您可以使用窗口函数来做到这一点:

select createtime, sum(new_users) over (order by createtime) as new_users
from (
  select createtime::date as createtime, count(user_id) as new_users 
  from "user"
  where createtime between '2015-12-03 00:00:00' and CURRENT_DATE 
  group by createtime 
) t
order by createtime asc;

user是保留关键字,需要加引号,否则不能作为标识符使用。

【讨论】:

  • 如何消除重复的时间戳?有同一天的日期,但一天中不同时间的日期不同
  • 没关系,我在 from satement (cast createtime as date) 和 distinct
  • @user3906778:我认为这些是日期,因为您在原始查询中也没有这样做。
  • 是的,你是对的。我编辑了帖子。谢谢您的帮助!效果很好!
【解决方案2】:

试试这个:

select x.Createtime, 
(select count (sub.user_id) from USER sub 
WHERE sub.createtime between '2015-12-03 00:00:00' and x.Createtime )as new_users 
from user x
where createtime between '2015-12-03 00:00:00' and CURRENT_DATE 
group by createtime 
order by createtime asc;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2011-04-26
    • 2021-12-25
    • 2014-07-17
    • 2010-11-26
    相关资源
    最近更新 更多