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 に答える