Python 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

我试图使用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)
回溯很长,但其主要部分是:

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