我试图使用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')
现在尝试使用NTILE:
^{pr2}$回溯很长,但主要部分是:
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 () OVER
功能给我同样的错误,需要用更复杂的查询或函数来创建这个
Here is a list of unsupported analytical functions在SQLITE中不可用
NTILE就是其中之一
优化器首先在查询中找到
OVER
,它认为它是一个列名,并且不希望(
跟在列名之后,所以会给出这个错误。在要复制到之前,请尝试以下操作:
为了实现这一点,以使表的大小可以增加,并且该技术仍然适用,我们必须做一些事情:
因此,首先我们按
^{pr2}$Marks
对表排序(本质上创建一个排名)。这将计算具有更高或相等Marks
的行数:我们加上
0.0
使这个数字成为一个浮点数,这样我们的分数就可以在下一步工作了。在然后取秩并除以总行数
这给了我们一个分数范围的分布,每个学生的百分位数。但是我们不关心每一个精确的百分位数,我们关心的是
NTILE(2)
或者它们是否在上半部分。在这就是
CASE
语句发挥作用的地方。如果学生的百分位数超过50%,他们就属于第1组,即前50个百分位。其他人都属于2组。在相关问题 更多 >
编程相关推荐