2016-09-26 10 views
0

val1の列に最大値の行を選択するsqliteテーブルがあります。私が来たソリューションCursorLoader使用Sqlite MAXを使用する - 最大値が等しい場合に最新のものを返す方法

id val1 val2  date 

1 28800 39600 2016-09-23T04:23:26Z 

2 28800 28800 2016-09-23T07:27:22Z 

は、次のとおりです。私は同じ最大値を持つ少数の行を持っているとき

String[] projection = new String[]{DB.COL_ID, 
       "MAX(" + DB.COL_VAR1 + ")" + "AS " + DB.COL_VAR1, 
       "date(" + DB.COL_TIME + ") AS " + DATE_TIME}; 

String selection = "((" + 
       DATE_TIME + " >= date('" + from + "')) AND (" + DATE_TIME + " <= date('" + to + "'))" + 
       "GROUP BY " + DATE_TIME; 

return new CursorLoader(context, ContentProvider.createUri(DBSleep.class, null), projection, selection, null, sortOrder); 

これは、上記のような場合を除いて、正常に動作します。 Sqlite MAX()は、それらのうちの1つを任意に選択しますが、最新の日付のものを選択します。 (したがって、上記の場合、結果は行2であり、行1ではなく、Sqliteは行1を返します。

これは可能ですか?

+1

使用ORDER BYをLIMIT 1 –

+0

問題と私はGROUP BYを持っている必要があります私はテーブルに存在する毎日1つの価値を持ちたいと思っています。 – southerton

答えて

1

単一の列の最大値を計算する代わりに、両方の列の組み合わせの最大値を計算する必要があります。ただ、それらの値を追加し、その上にその文字列の比較が働くので、数は常に一定の長さを持っていることを確認するためにprintf()を使用します。

... MAX(printf('%10d', val1) || date) ... 
+0

これは素晴らしい解決策であり、それは私のために働いた。 他の唯一のオプションは、これらの2つの列でMAXを個別に使用し、INNER JOINSを使用することだと思います。しかし、これには生のクエリが必要です。 – southerton

関連する問題