python - 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 的问题
解决方案
在不支持窗口函数的 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
推荐阅读
- c# - 检查将在一段中击中的球的最快方法
- swift - 当前日期边框颜色在 Swift 中的 JTCalendar 中多次显示
- vue.js - 动态图片路径 - Vue、Webpack、资产 - 意外需要
- java - Google Place Autocomplete 破坏了它所在的父片段
- youtube - 获取 youtube 歌曲列表
- driver - 如何在不使用 insmod 的情况下自动加载驱动程序
- python - NUMPY:选择偶数行,最后一列
- hbase - 为什么说 HBase 行是按字典顺序存储的?
- c++ - 为什么 printf 在 C++ 中的执行速度比 cout 快?scanf 也比 cin 慢,为什么?
- mysql - 2列的独特组合,顺序无关