J'obtiens cette erreur:
date | errors ------------+------------------------ 2016-07-17 | 2.2626862468027260 2016-07-19 | 0.78242171265427079381 2016-07-24 | 0.78221415607985480944 2016-07-05 | 0.77493816982687551525 2016-07-06 | 0.76678716179209113813
même si j'ai vérifié le résultat avec select.
J'utilise le serveur postgresql, j'ai une table nommée log comme le suivant:
select
a.date,
(cast(a.count as decimal) * 100 / b.count) as errors
from (
select date(time) as date, count(status) from log
where status!='200 OK'
group by date
order by date asc
) as a
join (
select date(time) as date, count(status)
from log
group by date
order by date asc
) as b on a.date=b.date
order by errors desc;
il y a beaucoup de lignes dans la base de données.
voici ma requête
select
a.date,
(cast(a.count as decimal) * 100 / b.count) as errors
from (
select date(time) as date, count(status) from log
where status!='200 OK'
group by date
order by date asc
) as a
join (
select date(time) as date, count(status)
from log
group by date
order by date asc
) as b on a.date=b.date
where errors >= 1
order by errors desc;
mais quand j'essaye cette requête sans le 'where errors> = 1', j'ai obtenu le résultat attendu avec 2 colonnes une date nommée et une autre nommée erreurs
voici le résultat
Column | Type | Modifiers
--------+--------------------------+--------------------------------------------------
path | text |
ip | inet |
method | text |
status | text |
time | timestamp with time zone | default now()
id | integer | not null default nextval('log_id_seq'::regclass)
Résultat:
ERROR: column "errors" does not exist LINE 11: where errors >= 1
3 Réponses :
remplacez where errors> = 1 par (cast (a.count as decimal) * 100 / b.count)> = 1 car il n'y a pas de colonne appelée errors mais une colonne dérivée:
select *
from (select a.date, (cast(a.count as decimal) * 100 / b.count) as errors
from (select date(time) as date, count(status)
from log
where status != '200 OK'
group by date
order by date asc) as a
join (select date(time) as date, count(status)
from log
group by date
order by date asc) as b
on a.date = b.date) q
where errors >= 1
order by errors desc;
OU
Elle peut être utilisée comme ci-dessus comme ci-dessous:
select a.date, (cast(a.count as decimal) * 100 / b.count) as errors
from (select date(time) as date, count(status)
from log
where status != '200 OK'
group by date
order by date asc) as a
join (select date(time) as date, count(status)
from log
group by date
order by date asc) as b
on a.date = b.date
where (cast(a.count as decimal) * 100 / b.count) >= 1
order by errors desc;
Votre requête serait plus simplement écrite comme suit:
select l.time::date as dte,
100 * avg( (status <> '200 OK')::int) as error_rate
from (
from log l
group by dte
having 100 * avg( (status <> '200 OK')::int) >= 1
order by error_rate desc;
Vous pouvez utiliser des alias dans la clause ayant de nombreuses bases de données, mais pas Postgres.
il y a une erreur de syntaxe, je crois.
sélectionnez l.time :: date comme dte, 100 * avg ((status <> '200 OK') :: int) comme error_rate du journal l group by dte ayant error_rate> = 1 order by error_rate desc J'ai essayé ceci mais il dit ce error_rate n'existe pas?
@OSEMATOUATI. . . Ma faute. Postgres est l'une des bases de données qui n'autorise pas de telles références.
Remplacez
where (cast(a.count as decimal) * 100 / b.count) >= 1
par
where errors >= 1
Vous ne pouvez pas utiliser d'alias de colonne dans le même niveau de votre requête.
Vous ne pouvez pas utiliser d'alias de colonne dans la clause
whereassociée auselect. Vous pouvez répéter l'expression, utiliser une sous-requête, un CTE ou une jointure latérale.