2015-03-17 3 views
2

Я хочу последнее не пустое значение столбца ignition_status в таблице предупреждений.Неправильное использование агрегатной функции MAX()

У меня есть столбец unix_time, который является временем в Unix Time Stamp, поэтому максимальное значение столбца unix_time, последнее - это запись.

Ниже мой код

cursor = dbUtilsObj.query(Alert.TABLE_NAME, new String[] { alertType_COLUMN }, " MAX(" + Alert.Columns.KEY_ALERT_UNIX_TIME 
       + ")" + AND + Alert.Columns.KEY_MACHINE_TELE_DEVICE_NO + EQUALS + AND + alertType_COLUMN + IS_NOT_NULL, 
       new String[] { String.valueOf(teleDevieNo) }, null, null, Alert.Columns.KEY_ALERT_UNIX_TIME); 

получение ошибки

(1) misuse of aggregate function MAX() 
: android.database.sqlite.SQLiteException: misuse of aggregate function MAX() (code 1): , while compiling: SELECT ignition_status FROM alert WHERE MAX(unix_time) and tele_device_no = ? and ignition_status IS NOT NULL ORDER BY unix_time 
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1113) 
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:686) 
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) 
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) 
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1420) 
at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1267) 
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1138) 
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1306) 
at com.jd.database.DBUtils.query(DBUtils.java:473) 
at com.jd.database.AlertDBUtils.getLatestNotNullValueForType_COLUMN_ByTeleDeviceNo(AlertDBUtils.java:161) 
at com.jd.sms.SMSIntentService.parseE1_VehicleMovemenEvent(SMSIntentService.java:158) 
at com.jd.sms.SMSIntentService.parseMsgAndInputInDb(SMSIntentService.java:122) 
at com.jd.sms.SMSIntentService.processMessage(SMSIntentService.java:97) 
at com.jd.sms.SMSIntentService.procassRequest(SMSIntentService.java:71) 
at com.jd.sms.SMSIntentService.onHandleIntent(SMSIntentService.java:39) 
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:176) 
at android.os.HandlerThread.run(HandlerThread.java:60) 
android.database.sqlite.SQLiteException: misuse of aggregate function MAX() (code 1): , while compiling: SELECT ignition_status FROM alert WHERE MAX(unix_time) and tele_device_no = ? and ignition_status IS NOT NULL ORDER BY unix_time 
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1113) 

Короче я пытаюсь запрос SELECT ignition_status FROM alert WHERE MAX(unix_time) and tele_device_no = ? and ignition_status IS NOT NULL ORDER BY unix_time

Так что должно пойти в dbUtilsObj.query() выше способом? По крайней мере, пожалуйста, скажите мне правильный необработанный запрос.

+4

Вы не можете использовать агрегатные функции где-п ... – germi

+0

@germi спасибо, он помог –

ответ

5

Вы не можете использовать агрегатную функцию, такую ​​как MAX(), как это в выборе.

Вместо рассмотреть следующие вопросы:

  • ORDER BY unixtime DESC сортировать результаты, соответствующие ваш выбор новейшим первым.

  • LIMIT 1 только для возврата первого результата, то есть новейшего.

+0

В настоящее время ваш ответ удалил мою ошибку (исключение), так что спасибо & upvote ... :) Но я проверю, работает ли он логически, как я намереваюсь, и если да, то и это примет. –

1

Использование MAX() фикцию в WHERE CLUASE, безусловно, возможно, и я лично проверил it.like ниже

SELECT ignition_status FROM alert 
where 
unix_time=(Select MAX(unix_time) from alert) 
and tele_device_no = ? and ignition_status IS NOT NULL ORDER BY unix_time 
+0

Интересно, что быстрее. –

Смежные вопросы