【问题标题】:Count records for a user for a given timeframe following a date计算用户在某个日期之后给定时间范围内的记录
【发布时间】:2021-01-08 19:41:58
【问题描述】:

所以我有下表:

User Date
A 2020-01-05
A 2020-07-01
A 2020-09-01
A 2020-12-31
B 2020-03-01
B 2020-11-05

但我想做的是:

  1. 取每个用户的最短(第一个)日期,然后
  2. 计算该用户在该最小(第一个)日期之后的记录数

以下是我想使用 PostgreSQL 实现的示例:

User min_date count_of_records_in_6_months
A 2020-01-05 2
B 2020-03-01 0

到目前为止我尝试过的内容如下(显然这只是给了我每个用户的总数)。

SELECT 
user
,MIN(date) as min_date
,count(*) as count_of_records
FROM myTable
GROUP BY user

【问题讨论】:

  • 您想要在最小日期之后的 6 个月内进行计数吗?或者相对于当前日期的最近六个月?
  • 我想要每个用户他们的最短日期之后的记录数(如我的示例输出表中所反映的)
  • 2020-07-10 是 2020-01-05 之后的 6 个多月。您的问题不清楚。
  • 这是我的错字...我更正为 2020-07-01(从第一个用户的最短日期算起 6 个月内)

标签: sql postgresql


【解决方案1】:

你可以使用窗口函数:

SELECT user,
       COUNT(*) FILTER (WHERE date <= min_date + interval '6 month')
FROM (SELECT t.*, MIN(date) OVER (PARTITION BY user) as min_date
      FROM myTable t
     ) t
GROUP BY user;

Here 是一个 dbfiddle。

【讨论】:

  • 我明白了,但这会让我得到我上面作为示例提供的茶几吗?
  • Gordon ...您是否使用“t”来引用“myTable”?另外,您是否在子查询中缺少括号?
  • 另外filter 应该排除计算的最小日期
  • 提供的答案似乎不起作用,也没有给我想要的最终结果......
  • 这里有什么见解吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 2016-05-18
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多