1

我有一个运行 sqlite 3.7.16.2 的开发环境和一个运行 sqlite 3.7.9 的生产环境,我遇到了一些意想不到的向后不兼容问题。

我有一个看起来像这样的表:

sqlite> select * from calls;
ID|calldate|calltype
1|2013-10-01|monthly
1|2013-11-01|3 month
1|2013-12-01|monthly
2|2013-07-11|monthly
2|2013-08-11|monthly
2|2013-09-11|3 month
2|2013-10-11|monthly
2|2013-11-11|monthly
3|2013-04-22|monthly
3|2013-05-22|monthly
3|2013-06-22|3 month
3|2013-07-22|monthly
4|2013-10-04|monthly
4|2013-11-04|3 month
4|2013-12-04|monthly
5|2013-10-28|monthly
5|2013-11-28|monthly

使用较新版本的 sqlite (3.7.16.2) 我可以使用它:

SELECT ID, MIN(calldate), calltype FROM calls WHERE calldate > date('NOW') GROUP BY ID;

这给了我:

ID|MIN(calldate)|calltype
1|2013-11-01|3 month
2|2013-11-11|monthly
4|2013-11-04|3 month
5|2013-10-28|monthly

但是,当我在旧版本的 sqlite (3.7.9) 上运行相同的代码时,我得到了这个:

ID|MIN(calldate)|calltype
1|2013-11-01|monthly
2|2013-11-11|monthly
4|2013-11-04|monthly
5|2013-10-28|monthly

我查看了此处的更改,但无法弄清楚为什么仍然会发生这种情况。有关如何解决此问题或如何重写我的查询的任何建议?

4

1 回答 1

0

您正在使用在SQLite 3.7.11中添加的扩展。

在标准 SQL 中,不允许使用既不出现在GROUP BY子句中也不包含在聚合函数中的列。(SQLite 默默地接受这个以与 MySQL 兼容,但从组中的一些随机记录返回数据。)

要从具有最小值的记录中获取其他列,您必须首先搜索每个组的最小值,然后将它们与原始表连接:

SELECT calls.ID,
       calls.calldate,
       calls.calltype
FROM calls
JOIN (SELECT ID,
             MIN(calldate) AS calldate
      FROM calls
      WHERE calldate > date('now')
      GROUP BY ID
     ) AS earliest
ON calls.ID       = earliest.ID       AND
   calls.calldate = earliest.calldate
于 2013-10-17T18:57:16.100 回答