首页 > 解决方案 > 使用子查询计算最后 5 行样本的列的 AVG

问题描述

试图找出构建此查询的最佳方法。我只是想获得每个 AVG()beta的最后 5 行/天symbol。然后用这个数字,我想symbols从最后 5 行/天中找到所有组合的总平均值。

当我从头开始构建查询时,我正在测试要使用的变量。

SELECT DISTINCT symbol, beta
FROM api.security_stats
WHERE date =  (SELECT MAX(date) FROM api.security_price) - interval '1 day'  AND
     symbol in ('AAPL','MSFT','AMD','NVDA','TSLA')
GROUP BY symbol, beta;

 symbol |        beta
--------+--------------------
 AAPL   |  1.226175475928623
 AMD    | 1.2651464334484317
 MSFT   | 1.0922307100829312
 NVDA   | 1.3928523562615582
 TSLA   | 1.7399931738843037

上面我只能得到一天的行beta

SELECT DISTINCT symbol, beta
FROM api.security_stats
WHERE date =  (SELECT MAX(date) FROM api.security_price) - interval '5 day'  AND
    symbol in ('AAPL','MSFT','AMD','NVDA','TSLA')
GROUP BY symbol, beta;

 symbol | beta
--------+------
(0 rows)

在这里,我尝试获取最近 5 天的数据,但没有显示任何数据。

如何创建一个返回每个 5 天 beta 平均值的子查询,symbol然后将该子查询添加到将计算子查询总结果的平均值的主查询中?

标签: sqlpostgresql

解决方案


如果我理解正确,您可以使用row_number()

SELECT symbol, AVG(beta) as avg_beta
FROM (SELECT ss.*,
             ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY date DESC) as seqnum
      FROM api.security_stats ss
     ) s
WHERE seqnum <= 5
GROUP BY symbol;

然后对整体平均值使用另一个子查询:

SELECT avg(avg_beta)
FROM (SELECT symbol, AVG(beta) as avg_beta
      FROM (SELECT ss.*,
                   ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY date DESC) as seqnum
            FROM api.security_stats ss
           ) ss
      WHERE seqnum <= 5
     ) ss;
GROUP BY symbol;

注意:如果所有符号都有天,那么您可以使用:

SELECT avg(avg_beta)
FROM (SELECT ss.*,
             ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY date DESC) as seqnum
      FROM api.security_stats ss
     ) ss
WHERE seqnum <= 5;

推荐阅读