对 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
等等。
我正在计算每天发生的次数,然后需要从中计算出平均值,仅针对最后一个月的结果(它们可以追溯到五月)。
答案取决于“上个月”的确切定义和“平均计数”的确切定义。
假设:
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()
。
不包括当天(“今天”),该日期是持续的,可能会导致平均值较低且具有误导性。
如果“上个月”应该意味着其他含义,您需要准确地定义它。月份有 28 到 31 天,这可能意味着不同的事情。由于您显然使用 timestamp
或
timestamptz
,而不是 date
,因此您还需要了解一天中的时间和当前时区可能产生的影响。转换为 date
(或一般“日”的定义)取决于使用 timezone
操作时当前的 timestamptz
设置。相关:
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)
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;