Pandas 的 Sqlite 的 NTILE 给出操作错误

cd9*_*d98 5 python sqlite pandas

我正在尝试使用 NTILE 函数从 pandas 查询 SQLite 数据库,但我没有成功,尽管我已经多次重新检查了语法。

下面是独立的示例。设置:

import pandas as pd
from sqlalchemy import create_engine
disk_engine = create_engine('sqlite:///test.db')

marks = pd.DataFrame({'StudentID': ['S1', 'S2', 'S3', 'S4', 'S5'],
                      'Marks': [75, 83, 91, 83, 93]})
marks.to_sql('marks_sql', disk_engine, if_exists='replace')
Run Code Online (Sandbox Code Playgroud)

现在尝试使用 NTILE:

q = """select StudentID, Marks, NTILE(2) OVER (ORDER BY Marks DESC)
        AS groupexample FROM marks_sql"""
pd.read_sql_query(q, disk_engine)
Run Code Online (Sandbox Code Playgroud)

回溯很长,但主要部分是:

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']
Run Code Online (Sandbox Code Playgroud)

谢谢!

Eoi*_*inS 3

NTILE () OVERSQLITE 中没有任何功能

给我同样的错误,需要使用更复杂的查询或函数创建它

以下是SQLITE 中不支持的分析函数的列表

NTILE 就是其中之一

优化器首先进入查询内部查找 find OVER,它认为这是一个列名,并且不希望遵循(列名,因此会出现此错误。

要复制 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;
Run Code Online (Sandbox Code Playgroud)

为了做到这一点,使得表的大小可以增长并且该技术仍然适用,我们做了一些事情:

因此,首先我们对表格进行排序Marks(本质上是创建一个排名)。这对具有更高或等于的行进行计数Marks

select count(*)+0.0 from marks_sql b where table.Marks >= b.Marks  --rank of Mark
Run Code Online (Sandbox Code Playgroud)

我们添加0.0使这个数字成为浮点数,以便我们的分数在下一步中起作用。

然后我们获取排名并将其除以总行数

select count(*) from marks_sql -- row count
Run Code Online (Sandbox Code Playgroud)

这为我们提供了分数范围的分布,即每个学生的百分位数。但我们并不关心每个确切的百分位数,我们关心的是NTILE(2)它们是否位于上半部分。

这就是该CASE声明发挥作用的地方。如果学生的百分位数超过 50%,他们就会属于第一组,即前 50 个百分位数。其他人都属于第二组。