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
where
associée auselect
. Vous pouvez répéter l'expression, utiliser une sous-requête, un CTE ou une jointure latérale.