У меня есть запрос, который возвращает среднюю (цену)
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
как заставить его возвращать 0, если значение недоступно?
sql
postgresql
Андрей
источник
источник
from web_price_scan
- это отдельный выбор; не уверен, в чем проблема?having
предложение безgroup by
(по умолчанию это одна группа). Он действует какwhere
пункт о совокупных результатах. В этом случае строки возвращаются только в том случае, если подзапрос 1-го уровня возвращает более 5 строк.Ответы:
использовать coalesce
редактировать
Вот пример
COALESCE
вашего запроса:IMHO
COALESCE
не следует использовать с,AVG
потому что он изменяет значение.NULL
означает неизвестное и ничего больше. Это не похоже на использование егоSUM
. В этом примере, если мы заменимAVG
наSUM
, результат не будет искажен. Добавление 0 к сумме никому не повредит, но вычисляя среднее значение с 0 для неизвестных значений, вы не получите реального среднего.В этом случае, я хотел бы добавить
price IS NOT NULL
вWHERE
пункте , чтобы избежать этих неизвестных значений.источник
from web_price_scan...
кажется, повторяется ...NULLIF(v1, v2)
он в значительной степени противоположенCOALESCE
тому, что возвращает,NULL
еслиv1
равноv2
.(этот ответ был добавлен, чтобы предоставить более короткие и общие примеры к вопросу - без включения всех конкретных деталей в исходный вопрос).
Здесь есть две различные «проблемы»: первая - если в таблице или подзапросе нет строк, вторая - если в запросе есть значения NULL.
Для всех версий, которые я тестировал, postgres и mysql игнорируют все значения NULL при усреднении и возвращают NULL, если усреднять нечего. Обычно это имеет смысл, поскольку NULL следует считать «неизвестным». Если вы хотите переопределить это, вы можете использовать coalesce (как предлагает Люк М).
конечно, "from foo" можно заменить на "from (... здесь любая сложная логика ...) as foo"
Теперь следует ли считать NULL строку в таблице за 0? Затем нужно использовать coalesce внутри вызова avg.
источник
Я могу придумать 2 способа добиться этого:
IFNULL ():
Функция IFNULL () возвращает указанное значение, если выражение равно ПУСТО (NULL). Если выражение НЕ ПУСТО (NOT NULL), эта функция возвращает выражение.
Синтаксис:
Пример IFNULL () с вашим запросом:
COALESCE ()
Функция COALESCE () возвращает первое ненулевое значение в списке.
Синтаксис:
Пример COALESCE () с вашим запросом:
источник