[英]SQL: Select average value of column for last hour and last day
Use conditional aggregation. 使用条件聚合。 Postgres offers very convenient syntax using the
FILTER
clause: Postgres使用
FILTER
子句提供了非常方便的语法:
SELECT user,
AVG(Volume) FILTER (WHERE created >= NOW() - interval '1 hour' AND created <= NOW()) as avg_1hour,
AVG(Volume) FILTER (WHERE created >= NOW() - interval '1 day' AND created <= NOW()) as avg_1day
FROM mytable
WHERE created >= NOW() - interval '1 DAY' AND
created <= NOW()
GROUP BY user;
This will filter out users who have had no activity in the past day. 这将过滤掉过去一天没有活动的用户。 If you want all users -- even those with no recent activity -- remove the
WHERE
clause. 如果您希望所有用户(甚至是那些没有近期活动的用户),请删除
WHERE
子句。
The more traditional method uses CASE
: 更传统的方法使用
CASE
:
SELECT user,
AVG(CASE WHEN created >= NOW() - interval '1 hour' AND created <= NOW() THEN Volume END) as avg_1hour,
AVG(CASE WHEN created >= NOW() - interval '1 day' AND created <= NOW() THEN Volume END) as avg_1day
. . .
You can do it like: 您可以这样做:
SELECT user, AVG(Volume)
FROM mytable
WHERE created >= NOW() - interval '1 hour'
AND created <= NOW()
GROUP BY user
Few things to remember, you are executing the query on same server with same time zone. 没什么要记住的,您正在同一时区的同一服务器上执行查询。 You need to group by the user to group all the values in volume column and then apply the aggregation function like
avg
to find average. 您需要按用户分组以将“体积”列中的所有值分组,然后应用诸如
avg
类的聚合函数来求平均值。 Similarly if you need both together then you could do the following: 同样,如果同时需要两者,则可以执行以下操作:
SELECT u1.user, u1.average, u2.average
FROM
(SELECT user, AVG(Volume) as average
FROM mytable
WHERE created >= NOW() - interval '1 hour'
AND created <= NOW()
GROUP BY user) AS u1
INNER JOIN
(SELECT user, AVG(Volume) as average
FROM mytable
WHERE created >= NOW() - interval '1 day'
AND created <= NOW()
GROUP BY user) AS u2
ON u1.user = u2.user
SELECT User, AVG(Volume) , ( IIF(created < DATE_SUB(NOW(), INTERVAL 1 HOUR) , 1 , 0) )IntervalType
WHERE created < DATE_SUB(NOW(), INTERVAL 1 HOUR)
AND created < DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY User, (IIF(created < DATE_SUB(NOW(), INTERVAL 1 HOUR))
Please Tell me about it's result :) 请告诉我它的结果:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.