Python Pandas中Sqlite的NTILE给出了操作错误
我试图使用NTILE函数从pandas查询SQLite数据库,但没有成功,尽管我已经多次检查了语法 下面是一个独立的示例。 设置: 现在尝试使用NTILE:Python Pandas中Sqlite的NTILE给出了操作错误,python,sqlite,pandas,Python,Sqlite,Pandas,我试图使用NTILE函数从pandas查询SQLite数据库,但没有成功,尽管我已经多次检查了语法 下面是一个独立的示例。 设置: 现在尝试使用NTILE: q = """select StudentID, Marks, NTILE(2) OVER (ORDER BY Marks DESC) AS groupexample FROM marks_sql""" pd.read_sql_query(q, disk_engine) 回溯很长,但其主要部分是: OperationalE
q = """select StudentID, Marks, NTILE(2) OVER (ORDER BY Marks DESC)
AS groupexample FROM marks_sql"""
pd.read_sql_query(q, disk_engine)
回溯很长,但其主要部分是:
OperationalError: near "(": syntax error
OperationalError: (sqlite3.OperationalError) near "(": syntax error [SQL: 'select StudentID, Marks, NTILE(2) OVER (ORDER BY Marks DESC)\n AS groupexample FROM marks_sql']
谢谢 SQLITE中没有超过功能的NTILE()
给我同样的错误,需要使用更复杂的查询或函数来创建
SQLITE中不可用
安提尔就是其中之一
优化器首先进入查询内部,在
上查找,它认为这是一个列名,并不希望(
跟在列名后面,因此会出现此错误
要复制NTILE,请尝试以下操作:
select * ,
case
when
(select count(*)+0.0 from marks_sql b where table.Marks >= b.Marks)
/(select count(*) from marks_sql ) >0.5
then 1
else 2 end
from marks_sql;
为了做到这一点,表的大小可以增加,并且这种技术仍然适用,我们做了一些事情:
因此,首先我们按照标记对表进行排序(基本上创建一个排名)。这将统计标记更高或相等的行:
select count(*)+0.0 from marks_sql b where table.Marks >= b.Marks --rank of Mark
我们加上0.0
,使这个数字成为一个浮点数,这样我们的分数在下一步就可以工作了
然后取秩,除以行总数
select count(*) from marks_sql -- row count
这给了我们一个分数范围的分布,每个学生的百分位数。但我们不关心每个精确的百分位数,我们关心的是第(2)部分,或者他们是否在上半部分
这就是案例
语句发挥作用的地方。如果学生的百分位数超过50%,他们将属于#1组,即前50个百分位数。其他所有人都属于#2组。自版本3.25.0(2018-09-15)起在SQLite中受支持。ntile(N)
是受支持的窗口函数之一:
参数N作为整数处理。此函数将分区尽可能平均地划分为N个组,并按order by子句定义的顺序或以其他任意顺序为每个组分配1到N之间的整数。如有必要,首先出现较大的组。此函数返回分配给组th的整数值在当前行中,是的一部分
您可以通过以下方式测试Python链接到的libsqlite3
版本:
python -c "import sqlite3; print(sqlite3.sqlite_version)"
例如:
- Ubuntu Xenial
$ docker run --rm -it ubuntu:xenial
# apt update
# apt install -y python3
# python3 -c "import sqlite3; print(sqlite3.sqlite_version)"
3.11.0
- Debian Buster上的官方Python Docker图像
$ docker run --rm -it python:3.6-buster \
python3 -c 'import sqlite3; print(sqlite3.sqlite_version)'
3.27.2
您可以在具有窗口功能支持的SQLite版本上进行查询:
>>> import sqlite3
>>> import pandas
>>>
>>> conn = sqlite3.connect(':memory:')
>>> marks = pandas.DataFrame({
... 'StudentID': ['S1', 'S2', 'S3', 'S4', 'S5'],
... 'Marks': [75, 83, 91, 83, 93]
... })
>>> marks.to_sql('marks_sql', conn, if_exists='replace')
>>>
>>> sql = '''
... SELECT StudentID, Marks, NTILE(2) OVER (ORDER BY Marks DESC) g
... FROM marks_sql
... '''
>>> pandas.read_sql_query(sql, conn)
StudentID Marks g
0 S5 93 1
1 S3 91 1
2 S2 83 1
3 S4 83 2
4 S1 75 2
哦,现在我明白了,谢谢!你有关于如何定义sqlite的NTILE的参考资料吗?这对答案很有帮助,我想think@cd98我花了一分钟的时间复制、编辑用您的替代品制作的NTILE()!NTILE…OVER现在可以在SQLite中实现。
>>> import sqlite3
>>> import pandas
>>>
>>> conn = sqlite3.connect(':memory:')
>>> marks = pandas.DataFrame({
... 'StudentID': ['S1', 'S2', 'S3', 'S4', 'S5'],
... 'Marks': [75, 83, 91, 83, 93]
... })
>>> marks.to_sql('marks_sql', conn, if_exists='replace')
>>>
>>> sql = '''
... SELECT StudentID, Marks, NTILE(2) OVER (ORDER BY Marks DESC) g
... FROM marks_sql
... '''
>>> pandas.read_sql_query(sql, conn)
StudentID Marks g
0 S5 93 1
1 S3 91 1
2 S2 83 1
3 S4 83 2
4 S1 75 2