如何在SQL中基于VALID列值计算BID和ASK列的30日平均值
解决方案
你需要用条件聚合来实现这个需求——不在WHERE子句里过滤VALID='Y'(那样会直接排除掉没有有效行的ASSET_ID),而是在聚合函数内部只对VALID='Y'的行进行计算,同时保留所有ASSET_ID的分组。
修改后的查询如下:
SELECT ASSET_ID, AVG(CASE WHEN VALID = 'Y' THEN NULLIF(BID, 0) END) AS AVG_BID_30D, AVG(CASE WHEN VALID = 'Y' THEN NULLIF(ASK, 0) END) AS AVG_ASK_30D FROM myDB.myTable WHERE SqlUnixTime > 1504900870 GROUP BY ASSET_ID;
逻辑解释:
CASE WHEN VALID = 'Y' THEN NULLIF(BID, 0) END:只对VALID='Y'的行处理BID值(把0转为NULL),其他行这部分结果直接是NULL。AVG()函数会自动忽略NULL值,所以最终只会计算符合VALID='Y'且BID/ASK≠0的行的平均值。- 因为没有在
WHERE里过滤VALID,所以所有满足时间条件的ASSET_ID都会被保留在分组结果里;如果某个ASSET_ID没有任何VALID='Y'的有效行,对应的平均值就会是NULL,完全符合你的要求。
内容的提问来源于stack exchange,提问作者user1357015
相关产品推荐
相关产品推荐

