Столбец не существует в PSQL - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь отфильтровать дни с ошибками более 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 ]

0 голосов
/ 26 октября 2018

Проблема заключается в том, что вы не можете ссылаться на псевдоним столбца 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
0 голосов
/ 26 октября 2018

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...