相当新的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月)。
答案 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
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天,这可能意味着各种各样的事情。由于您显然使用的是timestamp
或timestamptz
,而不是date
,因此您还需要了解时间和当前时区的可能影响。演员date
(或&#34;日期&#34;的定义)取决于您使用timezone
时的当前timestamptz
设置。
相关: