groupbystatement、sqlalchemy和postgresq的问题

2024-05-16 09:28:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我对下面的查询有一个问题;这个查询本身运行得很好,但是它是按秒分组的,我希望截断秒数并按分钟分组。我曾尝试过枣仁、提取物等,但一直没有任何运气。当引擎是sqlite时,extract('minute')工作正常,但在postgresql中就不行了。在

有谁能给我指出正确的方向吗?在

PostgreSQL版本:x86上的PostgreSQL 8.1.23 64-redhat-linux-gnu

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()

Tags: httpdatetimedatestringbypostgresqlcountcolumn
1条回答
网友
1楼 · 发布于 2024-05-16 09:28:53

在执行任何操作之前,请考虑升级到PostgreSQL 8.1 is long dead and forgotten的当前版本。在

不完全确定符号,但使用@Audrius in the comments的更新,它应该是这样工作的:

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()

基本上,使用date_trunc('min', http.date)代替SELECT中的http.date,以及{}和ORDER BY中的别名。在

顺便说一句:我发现用date作为timestamp的名称是非常误导人的。除此之外,我的建议是永远不要使用任何基类型名称作为标识符。导致非常混乱的错误消息和其他难以调试的错误。在

相关问题 更多 >