首页 > 解决方案 > python sqlite3中的滞后函数问题

问题描述

有以下代码在 sqlite3 中创建表

import sqlite3 as sq
con = sq.connect('test2.db')
q = """ 
    create table if not exists test (ip TEXT, time INTEGER, value INTEGER);
    insert into test (ip, time, value) values("192.168.1.1", 1607190826, 3010);
    insert into test (ip, time, value) values("192.168.1.1", 1607190827, 3012);
    insert into test (ip, time, value) values("192.168.1.1", 1607190828, 3019);
    insert into test (ip, time, value) values("192.168.1.2", 1607190829, 510);
    insert into test (ip, time, value) values("192.168.1.2", 1607190829, 515);
    insert into test (ip, time, value) values("192.168.1.2", 1607190829, 530);
    """
con.executescript(q)
con.commit()

我像这样在sqlite中使用滞后函数

qw = """SELECT ip, lag(value, 1, 0) OVER (ORDER BY ip) val2 from test"""

f = con.execute(qw)
for i in f:
  print(i)

但我收到以下错误代码。

OperationalError: near "(": syntax error

更新

它适用于 python 3.7。

我仍然有 python 3.6 的问题

标签: pythonsqlsqlitesubquerywindow-functions

解决方案


在不支持窗口函数的 SQLite 3.25 之前的版本中,您可以lag()使用相关子查询进行模拟。

从您的示例数据中,我怀疑您希望前面value的相同ip,按顺序排列time- 这不是您的代码所做的。窗口函数版本将是:

select ip, lag(value, 1, 0) over(partition by ip order by time) as val2
from test

等效的子查询解决方案如下:

select ip, 
    coalesce(
        (
            select value 
            from test t1 
            where t1.ip = t.ip and t1.time < t.time
            order by t1.time desc limit 1
        ), 
        0
    ) as val2 
from test t

推荐阅读