【问题标题】:problem with lag function in python sqlite3python sqlite3中的滞后函数问题
【发布时间】:2021-03-17 12:15:45
【问题描述】:

在 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 还是有问题

【问题讨论】:

  • 执行 select sqlite_version(); 以检查您的 SQLite 版本。窗口函数是在 3.25.0 版本中引入的。
  • 版本是'3.22.0'。

标签: python sql sqlite subquery window-functions


【解决方案1】:

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

根据您的示例数据,我怀疑您希望之前的 valueip 相同,由 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

【讨论】:

  • 它有效,但我使用 pandas 数据框和 diff 方法。
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多