Помощь с запросом Google App Engine и датой и временем

Я использую следующие данные:

date                     latitude         route      name   longitude
2009-04-11 00:50:31.640000  40.80708    White Loop  86  -77.85891
2009-04-11 00:50:27.718000  40.80708    White Loop  86  -77.85891
2009-04-11 00:50:01.562000  40.80708    White Loop  86  -77.85891
2009-04-11 00:49:48.765000  40.80708    White Loop  86  -77.85891
2009-04-11 00:49:34.796000  40.802338   White Loop  86  -77.85073
2009-04-11 00:49:22.468000  40.802338   White Loop  86  -77.85073
2009-04-11 00:48:35.671000  40.802338   White Loop  86  -77.85073
2009-04-11 00:48:29.125000  40.802338   White Loop  86  -77.85073
2009-04-11 00:47:19.906000  40.79889    White Loop  86  -77.85299
2009-04-11 00:47:03.609000  40.79889    White Loop  86  -77.85299
2009-04-11 00:46:54.437000  40.79889    White Loop  86  -77.85299
2009-04-11 00:46:52.687000  40.79889    White Loop  86  -77.85299
2009-04-11 00:46:51.125000  40.79889    White Loop  86  -77.85299
2009-04-11 00:46:48.578000  40.79889    White Loop  86  -77.85299
2009-04-11 00:46:41.406000  40.79889    White Loop  86  -77.85299
2009-04-11 00:50:31.687000  40.792194   White Loop  82  -77.863235
2009-04-11 00:50:27.781000  40.792194   White Loop  82  -77.863235
2009-04-11 00:50:01.640000  40.792194   White Loop  82  -77.863235
2009-04-11 00:49:48.812000  40.792194   White Loop  82  -77.863235
2009-04-11 00:49:34.843000  40.794914   White Loop  82  -77.866844
2009-04-11 00:49:22.531000  40.794914   White Loop  82  -77.866844
2009-04-11 00:48:35.718000  40.794914   White Loop  82  -77.866844
2009-04-11 00:48:29.156000  40.79738    White Loop  82  -77.86755
2009-04-11 00:47:19.984000  40.79738    White Loop  82  -77.86755
2009-04-11 00:47:03.656000  40.79738    White Loop  82  -77.86755
2009-04-11 00:46:54.484000  40.79738    White Loop  82  -77.86755
2009-04-11 00:46:52.734000  40.79738    White Loop  82  -77.86755
2009-04-11 00:46:51.156000  40.79738    White Loop  82  -77.86755
2009-04-11 00:46:48.640000  40.79738    White Loop  82  -77.86755
2009-04-11 00:46:41.453000  40.79738    White Loop  82  -77.86755
2009-04-11 00:50:31.656000  40.776066   White Loop  81  -77.88552
2009-04-11 00:50:27.750000  40.776066   White Loop  81  -77.88552
2009-04-11 00:50:01.593000  40.776066   White Loop  81  -77.88552
2009-04-11 00:49:48.796000  40.776066   White Loop  81  -77.88552
2009-04-11 00:49:34.812000  40.764687   White Loop  81  -77.88271
2009-04-11 00:49:22.515000  40.764687   White Loop  81  -77.88271
2009-04-11 00:48:35.703000  40.764687   White Loop  81  -77.88271
2009-04-11 00:48:29.140000  40.764687   White Loop  81  -77.88271
2009-04-11 00:47:19.937000  40.76335    White Loop  81  -77.876755
2009-04-11 00:47:03.640000  40.76335    White Loop  81  -77.876755
2009-04-11 00:46:54.468000  40.76335    White Loop  81  -77.876755
2009-04-11 00:46:52.718000  40.76335    White Loop  81  -77.876755
2009-04-11 00:46:51.156000  40.76335    White Loop  81  -77.876755
2009-04-11 00:46:48.609000  40.76335    White Loop  81  -77.876755
2009-04-11 00:46:41.437000  40.76335    White Loop  81  -77.876755

Как я могу уточнить запрос, чтобы получить только самые последние строки для каждого «имени»? Например, я хочу получить только:

2009-04-11 00:50:31.640000  40.80708    White Loop  86  -77.85891
2009-04-11 00:50:31.687000  40.792194   White Loop  82  -77.863235
2009-04-11 00:50:31.656000  40.776066   White Loop  81  -77.88552

И я хочу, чтобы все результаты имели значения даты не старше 1 минуты. Имейте в виду, что значения даты являются свойствами Python datetime.

Спасибо


person Community    schedule 15.04.2009    source источник


Ответы (3)


В SQL вы можете делать самые разные необычные вещи, но Google API довольно ограничен.

Учитывая, что вы хотите, чтобы все записи были не старше 1 минуты, я бы просто запросил базу данных для всех записей старше 1 минуты, а затем попросил бы python сопоставить результаты и отклонить повторяющиеся строки.

Судя по данным, которые вы здесь показываете, похоже, что вы получаете пару строк на каждое «имя» в минуту или около того, так что такого подхода должно быть достаточно, даже если он неэлегантен.

Альтернативой было бы сохранить вторую таблицу только с самой последней записью для каждого «имени» в ней ... и время от времени отбирать эту таблицу, чтобы удалить записи старше минуты.

person NickZoic    schedule 16.04.2009

Думаю, я нашел достойное решение. Проблема была в моей модели:

date = db.DateTimeProperty(auto_now_add=True)

Это означало, что для каждого экземпляра этой модели даты будут немного разными. Это очень затрудняет группировку моих данных. Итак, в моей функции cron я убедился, что каждый запрос api имеет одинаковую временную метку.

Следующим изменением было создание текущей таблицы. Каждый раз, когда запускается cron, он удаляет все в текущей таблице (только одну строку) и добавляет новую строку. Эта новая строка затем добавляется в таблицу журнала, в которой полупостоянно хранятся результаты.

person Community    schedule 16.04.2009

Конечно, это сработает:

query = db.GqlQuery("SELECT * FROM [table] ORDER BY date DESC LIMIT BY [num of rows]")

В качестве альтернативы вы можете использовать неравенство, например «date> 2009-04-11 00:50», которое вернет все результаты после этого времени.

person graemeboy    schedule 20.06.2009