2017-05-19 2 views
1

J'ai un peu de mal à déterminer quels jours ont plus de 1% des erreurs d'état ici est la table respective:Python psql divisé en colonne

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) 
Indexes: 
    "log_pkey" PRIMARY KEY, btree (id) 

les parties importantes sont le statut qui est soit 200 OK ou une erreur et le temps qui est la date, le reste est un peu inutile pour ce problème particulier, je crois

et c'est le code que j'ai jusqu'à présent:

def heavy_error_days(): 
    db = psycopg2.connect("dbname=news") 
    c = db.cursor() 
    c.execute("select date(log.time), errors\ 
    from log, (select count(status)::numeric/(select count(status)\ 
    from log)from log where status <> '200 OK'\ 
    and date(log.time) = date(log.time)) as errors\ 
    group by date, errors") 
    print c.fetchone() 

je crois que Je dois faire est de multiplier les erreurs par 100 et les diviser en leur date respective, mais je ne sais pas comment l'écrire.

si quelqu'un peut m'aider avec cela, je serais très reconnaissant.

Erreur

File "news.py", line 33 
    c.execute("with a as (select distinct (sum(case when status <> '200 OK' then 1 else 0 end) over w * 100)/count(1) over w perc, "time"::date d from log window w as (partition by "time"::date))select * from a where perc > 1") 
                                     ^
SyntaxError: invalid syntax 

j'ai remarqué que le temps était entre guillemets et que pourrait être le problème si je l'ai changé guillemets simples et a obtenu cette erreur:

Traceback (most recent call last): 
    File "news.py", line 41, in <module> 
    heavy_error_days() 
    File "news.py", line 33, in heavy_error_days 
    c.execute("with a as (select distinct (sum(case when status <> '200 OK' then 1 else 0 end) over w * 100)/count(1) over w perc, 'time'::date d from log window w as (partition by 'time'::date))select * from a where perc > 1") 
psycopg2.DataError: invalid input syntax for type date: "time" 
LINE 1: ...else 0 end) over w * 100)/count(1) over w perc, 'time'::da... 
                  ^

Répondre

1

cette requête devrait faire l'affaire:

with a as (
    select distinct (sum(case when status <> '200 OK' then 1 else 0 end) over w * 100)/count(1) over w perc, "time"::date d 
    from log 
    window w as (partition by "time"::date) 
) 
select * 
from a 
where perc > 1 

basé sur exa mple:

construction:

t=# create table log("time" timestamptz, status text); 
CREATE TABLE 
t=# insert into log values (now(),'200 OK'),(now(),'200 OK'),(now(),'ERR'),(now()-'2 days'::interval,'200 OK'); 
INSERT 0 4 

requête:

t=# with a as (
    select distinct (sum(case when status <> '200 OK' then 1 else 0 end) over w * 100)/count(1) over w perc, "time"::date d 
    from log 
    window w as (partition by "time"::date) 
) 
select * 
from a 
where perc >= 0 
; 
perc |  d 
------+------------ 
    0 | 2017-05-17 
    33 | 2017-05-19 
(2 rows) 
+0

lorsque je tente d'exécuter cette requête, il me dit qu'il ya une erreur de syntaxe dans la dernière où –

+0

l'erreur exacte faire plaisir? parce que la requête fonctionne dans psql –

+0

im en cours d'exécution sur python en utilisant psycopg im va mettre à jour mon message avec l'erreur afin qu'il soit mieux formaté –