简体   繁体   English

SQL:选择最后一小时和最后一天的列平均值

[英]SQL: Select average value of column for last hour and last day

I have a table like below image. 我有一张桌子,如下图。 What I need is to get average value of Volume column, grouped by User both for 1 hour and 24 hours ago . 我需要的是获取“ Volume列的average ,并按User 在1小时和24小时前进行分组。 How can I use avg with two different date range in single query ? 如何在单个查询中使用具有两个不同日期范围的avg
在此处输入图片说明

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM