Столбец не существует в PSQL
Я пытаюсь отфильтровать дни с ошибками более 1% для веб-сайта. У меня уже есть таблица, в которой показаны отдельные дни с соответствующими коэффициентами ошибок, но когда я пытаюсь включить предложение "где" или "иметь", чтобы отфильтровать дни с соотношением ниже 0,01, запрос перестает работать, и он говорит мой столбец не существует, хотя я объявил его несколькими символами ранее. Это код:
select date(time) as day,
(trunc(cast(count(*) filter (where status similar to '%404%') as decimal) / count(*), 5)) as col1
from log
where col1 > 0.01
group by day
order by col1 desc;
Это ошибка, которую я получаю
ERROR: column "col1" does not exist
LINE 4: where col1 > 0.01
Спасибо!!
2 ответа
col1
является результатом агрегации. Postgres позволяет использовать псевдонимы для столбцов в group by
, но нет having
, Так что переместите условие в having
пункт:
select date(time) as day,
(trunc(cast(count(*) filter (where status similar to '%404%') as decimal) / count(*), 5)) as col1
from log
group by day
having (trunc(cast(count(*) filter (where status similar to '%404%') as decimal) / count(*), 5)) > 0.01
order by col1 desc;
Хотя filter
действительно причудливый, я думаю, что эта версия логики проще:
trunc(cast(avg( (status similar to '%404%')::decimal), 5) as col1
Также легче вписаться в having
пункт.
Проблема в том, что вы не можете ссылаться на псевдоним столбца col1
в WHERE
предложение, если только вы не наложите слой на запрос.
Повторная опция условия:
select date(time) as day,
(trunc(cast(count(*) filter (where status similar to '%404%') as decimal) / count(*), 5)) as col1
from log
group by day
having (trunc(cast(count(*) filter (where status similar to '%404%') as decimal) / count(*), 5)) > 0.01
order by col1 desc;
Опция производного стола:
select day, col1
from (select date(time) as day,
(trunc(cast(count(*) filter (where status similar to '%404%') as decimal) / count(*), 5)) as col1
from log
group by day) as derivedTable
where col1 > 0.01