使用 Sqlite MAX - 如何 return latest 在少数相等的最大值的情况下
Using Sqlite MAX - how to return latest in case of few equal max values
我有一个 sqlite table,我想在其中 select val1 列中具有最大值的行。
id val1 val2 date
1 28800 39600 2016-09-23T04:23:26Z
2 28800 28800 2016-09-23T07:27:22Z
使用 CursorLoader 我得到的解决方案是这样的:
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() 会 select 任意其中之一,而我想 select 具有最新日期的那个。 (所以在上面的例子中,结果应该是第 2 行而不是第 1 行,而 Sqlite returns row1)。
可以吗?
您必须计算两列组合的最大值,而不是计算单个列的最大值。只需附加它们的值,并使用 printf() 确保数字始终具有固定长度,以便对其进行字符串比较:
... MAX(printf('%10d', val1) || date) ...
我有一个 sqlite table,我想在其中 select val1 列中具有最大值的行。
id val1 val2 date
1 28800 39600 2016-09-23T04:23:26Z
2 28800 28800 2016-09-23T07:27:22Z
使用 CursorLoader 我得到的解决方案是这样的:
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() 会 select 任意其中之一,而我想 select 具有最新日期的那个。 (所以在上面的例子中,结果应该是第 2 行而不是第 1 行,而 Sqlite returns row1)。
可以吗?
您必须计算两列组合的最大值,而不是计算单个列的最大值。只需附加它们的值,并使用 printf() 确保数字始终具有固定长度,以便对其进行字符串比较:
... MAX(printf('%10d', val1) || date) ...