获得上个月"的平均值#34;只要

时间:2017-08-26 09:57:50

标签: sql postgresql date average

相当新的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 

等等。

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

3 个答案:

答案 0 :(得分:0)

我相信Postgresql和其他RDBMS有try { URL u = new URL("http://www.google.com"); HttpURLConnection c = (HttpURLConnection)u.openConnection(); c.connect(); } catch (Exception e) { Log.v(TAG, "Error is " + e.getMessage()); } 来计算平均值。

AVG()

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

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]

答案 1 :(得分:0)

我认为你只需要一个where子句:

T

答案 2 :(得分:0)

答案取决于&#34;上个月的确切定义&#34;以及&#34;平均数&#34;的确切定义。

假设:

  • 您的列已定义为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()

不包括当天(&#34;今天&#34;),这是正在进行的,可能导致较低的,误导性的平均值。

如果&#34;上个月&#34;应该意味着别的东西,你需要定义它 完全 。月份有28到31天,这可能意味着各种各样的事情。由于您显然使用的是timestamptimestamptz,而不是date,因此您还需要了解时间和当前时区的可能影响。演员date(或&#34;日期&#34;的定义)取决于您使用timezone时的当前timestamptz设置。

相关: