SQL查询,用于计算历史平均值并检查当前值是否大于3

时间:2018-05-02 03:10:40

标签: sql

我尝试计算自上次时间戳以来的平均值并拉出平均值大于3的所有记录。我当前的查询是:

SELECT AVG(BID)/BID AS Multiple 
FROM cdsData 
where Multiple > 3 
  and SqlUnixTime > 1492225582 
group by ID_BB_RT;

我有一个表cdsData,并且unix时间是转换后的第15个月。最后,我希望在我显示的ID内计算该组。我不确定它为什么会失败,但是它说where子句中的字段Multiple是未知的。

2 个答案:

答案 0 :(得分:2)

<强> 1) SQL从右到左向后评估。因此,在select子句之前解析和评估where子句。因此,尚未发生AVG(BID)/ BID到Multiple的别名。

你可以试试这个。

SELECT AVG(BID)/BID AS Multiple 
FROM cdsData 
WHERE SqlUnixTime > 1492225582 
GROUP BY ID_BB_RT Having (AVG(BID)/BID)>3 ;

Select Multiple 
From (SELECT AVG(BID)/BID AS Multiple 
      FROM cdsData 
      Where SqlUnixTime > 1492225582 group by ID_BB_R)X 
Where multiple >3

<强> 2) 纠正上述错误后,您将再遇到一个错误:

Column 'BID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

要纠正此问题,您必须在group by子句中插入BID列。

答案 1 :(得分:2)

  

我尝试计算自上次时间戳以来的平均值,并拉出平均值大于3的所有记录。

我认为您的意图正确地说明如下,&#34;我正在尝试计算自上次时间戳以来的平均值,并选择平均值大于个别出价的3倍的所有行&#34;。

事实上,更好地重申您的目标,&#34; 我想选择自上一个时间戳以来的所有行,其中出价低于平均出价的1/3 &#34;

为此,步骤如下:
1)子查询查找自上次时间戳以来的平均出价除以3的行数。
2)外部查询选择自上一个时间戳以来的行,其中单个出价是&lt;子查询返回的值。

以下SQL语句执行此操作:

SELECT BID
FROM   cdsData
WHERE  SqlUnixTime > 1492225582
  AND  BID <
       (
           SELECT AVG(BID) / 3
           FROM   cdsData
           WHERE  SqlUnixTime > 1492225582 
       )
ORDER BY BID;