3

次のクエリに問題があります。これ自体は正常に動作しますが、秒ごとにグループ化されます。秒を切り捨て、分ごとにグループ化したいと考えています。date_trunc、extract などを試してみましたが、うまくいきませんでした。エンジンが sqlite の場合、extract('minute') は正常に機能しましたが、postgresql では機能しませんでした。

私を正しい方向に向けることができる人はいますか?

PostgreSQL バージョン: x86_64-redhat-linux-gnu 上の PostgreSQL 8.1.23

Column('id', Integer, primary_key=True),
        Column('date', TIMESTAMP),
        Column('src', String),
        Column('dst', String),
        Column('len', String),
        Column('sport', String),
        Column('dport', String),
        Column('method', String),
        Column('host', String),
        Column('useragent', String),
        Column('statusline', String),
        Column('location', String),
        Column('server', String),
        Column('load', String),

now = datetime.datetime.now()                
DD = now - datetime.timedelta(minutes=60)    
DD = DD.strftime('%Y-%m-%d %H:%M:%S')        
query = session.query(HTTP.date,HTTP.statusline, func.count(HTTP.statusline).                                                                           
                label('count')).filter(HTTP.statusline.like('%'+status+'%'), HTTP.date>=(DD)).group_by(HTTP.date, HTTP.statusline).order_by(asc(HTTP.date)).all()
4

1 に答える 1

3

他のことをする前に、 PostgreSQL 8.1の現在のバージョンにアップグレードすることを検討しください。

表記については完全にはわかりませんが、コメントの @Audriusからの更新により、次のように機能するはずです。

query = session.query(
       date_trunc('min', http.date).label('date_minute')
      ,http.statusline
      ,func.count(http.statusline).label('count')
   ).filter(http.statusline.contains(status)
           ,http.date>=(DD)
   ).group_by('date_minute'
             ,http.statusline
   ).order_by(asc('date_minute')).all()

基本的にはinのdate_trunc('min', http.date)代わりに、別名 inとを使います。http.dateSELECTGROUP BYORDER BY

dateところで:の名前として使用するのは非常に誤解を招くと思いますtimestamp。それとは別に、私のアドバイスは、基本型名を識別子として使用しないことです。非常に紛らわしいエラー メッセージや、デバッグが難しいその他のエラーにつながります。

于 2013-04-07T19:02:40.303 に答える