在sqlite3中调用时,在Python中调用时,Sqlite输出会有所不同

时间:2015-07-28 00:05:46

标签: python database sqlite pandas

我在sqlite数据库中有一个表,当通过我的终端在sqlite3中运行时以及在python脚本中调用时,我会收到两个输出。 python脚本中的输出是奇数,它不是一个实际的数据点。

表格如下:

    SELECT manager_name, points_for, wins, year FROM standings;

    manager_name    points_for  wins        year
     Eddy           1513.82     8           2014 
     Drew           1351.8      10          2014
     Sammy          1497.72     10          2014 
     Mike2          1474.22     10          2014 
     Sam            1360.94     7           2014 
     Rick           1379.1      7           2014          
     Jeff           1381.1      6           2014          
     Josh           1411.16     5           2014         
     Bay            1237.2      5           2014         
     Mike           1187.68     6           2014          
     G              1208.66     5           2014                   
     Brett          1245.78     5           2014          
     Luke           1395.76     4           2014              
     A  Roberman    1331.1      3           2014 

当我在sqlite3中运行以下查询时,我收到了正确的响应(大多数以积分作为决胜局获胜)

    SELECT max(wins), points_for, manager_name, year FROM (SELECT manager_name, wins, points_for FROM standings ORDER BY wins DESC, points_for DESC);

    OUTPUT:

   manager_name   points_for   max(wins)    year
     SamK          1497.72       10         2014

但是当我通过python脚本运行查询时,我得到了一个非常奇怪的结果。

    df = pd.read_sql(" SELECT max(wins), points_for, manager_name, year FROM (SELECT manager_name, wins, points_for, year FROM standings ORDER BY wins DESC, points_for DESC)", conn)

    print df
               max(wins)  points_for manager_name  year
        0         10      1497.72        Al R      2014

请记住,我在这个数据库中运行了许多类似的python脚本,并且从来没有得到像这样没有意义的输出。

使用pysqlite进行编辑具有相同的结果

    c.execute('SELECT max(wins), points_for, manager_name, year FROM (SELECT manager_name, wins, points_for, year FROM standings ORDER BY wins DESC, points_for DESC)')

    r = c.fetchone()
    print r
    (10, 1497.72, u'Al R', 2014)

1 个答案:

答案 0 :(得分:1)

两个输出都是正确的。

max(wins)输出子查询中找到的最大winspoints_formanager_nameyear从某个随机行输出值。

(子查询中的ORDER BY无效;如果需要,max()会自行排序。)

要从与max()匹配的行之一获取行值,必须使用SQLite 3.7.11或更高版本(这是SQLite扩展,而不是标准SQL的一部分)。

要根据ORDER BY实际获取第一行,您必须使用LIMIT clause

SELECT wins, points_for, manager_name, year
FROM standings
ORDER BY wins DESC, points_for DESC
LIMIT 1;