我有一个返回avg(价格)的查询
select avg(price)
from(
select *, cume_dist() OVER (ORDER BY price desc) from web_price_scan
where listing_Type='AARM'
and u_kbalikepartnumbers_id = 1000307
and (EXTRACT(Day FROM (Now()-dateEnded)))*24 < 48
and price>( select avg(price)* 0.50
from(select *, cume_dist() OVER (ORDER BY price desc)
from web_price_scan
where listing_Type='AARM'
and u_kbalikepartnumbers_id = 1000307
and (EXTRACT(Day FROM (Now()-dateEnded)))*24 < 48
)g
where cume_dist < 0.50
)
and price<( select avg(price)*2
from( select *, cume_dist() OVER (ORDER BY price desc)
from web_price_scan
where listing_Type='AARM'
and u_kbalikepartnumbers_id = 1000307
and (EXTRACT(Day FROM (Now()-dateEnded)))*24 < 48
)d
where cume_dist < 0.50)
)s
having count(*) > 5
Run Code Online (Sandbox Code Playgroud)
如果没有可用值,如何使其返回0?
Luc*_*c M 161
使用coalesce
COALESCE(value [, ...])
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)The COALESCE function returns the first of its arguments that is not null. Null is returned only if all arguments are null. It is often used to substitute a default value for null values when data is retrieved for display.
编辑以下是您的查询的COALESCE示例:
SELECT AVG( price )
FROM(
SELECT *, cume_dist() OVER ( ORDER BY price DESC ) FROM web_price_scan
WHERE listing_Type = 'AARM'
AND u_kbalikepartnumbers_id = 1000307
AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
AND COALESCE( price, 0 ) > ( SELECT AVG( COALESCE( price, 0 ) )* 0.50
FROM ( SELECT *, cume_dist() OVER ( ORDER BY price DESC )
FROM web_price_scan
WHERE listing_Type='AARM'
AND u_kbalikepartnumbers_id = 1000307
AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
) g
WHERE cume_dist < 0.50
)
AND COALESCE( price, 0 ) < ( SELECT AVG( COALESCE( price, 0 ) ) *2
FROM( SELECT *, cume_dist() OVER ( ORDER BY price desc )
FROM web_price_scan
WHERE listing_Type='AARM'
AND u_kbalikepartnumbers_id = 1000307
AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
) d
WHERE cume_dist < 0.50)
)s
HAVING COUNT(*) > 5
Run Code Online (Sandbox Code Playgroud)
COALESCE不应该使用恕我直言,COALESCE因为它修改了价值.AVG意味着未知,没有别的.这不像是在使用它NULL.在此示例中,如果我们替换SUM为AVG,则结果不会失真.将0添加到总和不会伤害任何人,但计算未知值的平均值为0,则不会得到实际平均值.
在这种情况下,我会添加SUMin price IS NOT NULL子句以避免这些未知值.
tob*_*xen 20
(这个答案被添加以提供更短和更通用的问题示例 - 不包括原始问题中的所有案例特定细节).
这里有两个不同的"问题",第一个是表或子查询没有行,第二个是查询中是否有NULL值.
对于我测试的所有版本,postgres和mysql在平均时将忽略所有NULL值,如果没有任何平均值,它将返回NULL.这通常是有道理的,因为NULL被认为是"未知的".如果要覆盖它,可以使用coalesce(如Luc M所建议的那样).
$ create table foo (bar int);
CREATE TABLE
$ select avg(bar) from foo;
avg
-----
(1 row)
$ select coalesce(avg(bar), 0) from foo;
coalesce
----------
0
(1 row)
$ insert into foo values (3);
INSERT 0 1
$ insert into foo values (9);
INSERT 0 1
$ insert into foo values (NULL);
INSERT 0 1
$ select coalesce(avg(bar), 0) from foo;
coalesce
--------------------
6.0000000000000000
(1 row)
Run Code Online (Sandbox Code Playgroud)
当然,"来自foo"可以被"from(...任何复杂的逻辑......)替换为foo"
现在,表中的NULL行是否应计为0?然后必须在avg调用中使用coalesce.
$ select coalesce(avg(coalesce(bar, 0)), 0) from foo;
coalesce
--------------------
4.0000000000000000
(1 row)
Run Code Online (Sandbox Code Playgroud)