仅获取“上个月”的平均值

问题描述 投票:0回答:3

对 SQL 还很陌生,并且遇到了障碍。

我有这个查询,效果很好:

SELECT 
(COUNT(*)::float / (current_date - '2017-05-17'::date)) AS "avg_per_day"
FROM "table" tb;

我现在希望它仅包含上个月的数据,而不是所有时间的数据。

我尝试过做一些类似的事情:

SELECT 
(COUNT(*)::float / (current_date - (current_date - '1 month' ::date)) AS "avg_per_day"
FROM "table" tb;

语法显然是错误的,但我不确定正确的答案是什么。已经用谷歌搜索并尝试了各种选项都无济于事。

我无法使用简单的 AVG,因为我需要的数字是上个月数据的每天 AVG。因此,我计算了行数除以自第一次发生以来的天数,以获得每天的 AVG。

我有一列告诉我发生的日期,但是数据集中有多行具有相同的日期。例如

created_at 
----------------------------
Monday 27th June 2017 12:00 
Monday 27th June 2017 13:00 
Tuesday 28th June 2017 12:00 

等等。

我正在计算每天发生的次数,然后需要从中计算出平均值,仅针对最后一个月的结果(它们可以追溯到五月)。

sql postgresql date average
3个回答
0
投票

答案取决于“上个月”的确切定义和“平均计数”的确切定义。

假设:

  • 您的专栏已定义
    created_at timestamptz NOT NULL
  • 您希望每天的平均行数 - 没有任何行的天数计为 0。
  • 涵盖 30 天完全,不包括今天。
SELECT round(count(*)::numeric / 30, 2)  -- simple now with a fixed number of days
FROM   tbl
WHERE  created_at >= (now()::date - 30)
AND    created_at <   now()::date        -- excl. today

舍入是可选的,但您需要

numeric
而不是
float
才能以这种方式使用
round()

不包括当天(“今天”),该日期是持续的,可能会导致平均值较低且具有误导性。

如果“上个月”应该意味着其他含义,您需要准确地定义它。月份有 28 到 31 天,这可能意味着不同的事情。由于您显然使用 timestamp

timestamptz
,而不是
date
,因此您还需要了解一天中的时间和当前时区可能产生的影响。转换为
date
(或一般“日”的定义)取决于使用
timezone
操作时当前的
timestamptz
设置。
相关:

    忽略 Postgres 时间戳的时区
  • 仅选择今天(自午夜以来)的时间戳
  • https://stackoverflow.com/questions/30894296/subtract-hours-from-the-now-function/30896121?s=2|0.8739#30896121

0
投票

SELECT (COUNT(*)::float / (current_date - (current_date - '1 month' ::date)) AS "avg_per_day" FROM "table" tb WHERE created_at > (current_date - '1 month' ::date)



0
投票
AVG()

来计算平均值。


SELECT AVG(tb.columnName) AS avg_per_month FROM someTable tb WHERE tb.createdDate >= [start date of month] AND tb.createdDate <= [end date of month]

编辑:我用 INTERVAL 减去当前日期。我用的是手机,所以无法测试。

SELECT (COUNT(*)::float / (current_date - ( current_date - INTERVAL '1 month')) AS "avg_per_day" FROM "table" tb;

	
© www.soinside.com 2019 - 2024. All rights reserved.