2009-04-15 6 views
1

J'utilise les données suivantes:Aide avec Google App Engine requête et datetime

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 

Comment puis-je affiner la requête pour obtenir uniquement les lignes les plus récentes pour chaque « nom »? Par exemple, je veux seulement retrouver avec:

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 

Et je veux tous les résultats pour avoir des valeurs de date qui ne sont pas de plus de 1 minute. Gardez à l'esprit que les valeurs de date sont des propriétés Python datetime.

Merci

Répondre

1

Dans SQL vous pouvez faire toutes sortes de choses de fantaisie, mais Google API est assez limitée. Étant donné que vous voulez que tous les enregistrements ne datent pas de plus d'une minute, je demande simplement à la base de données tous les enregistrements de moins de 1 minute, puis python rassemble les résultats et rejette les lignes en double. D'après les données que vous affichez ici, il semble que vous obteniez quelques lignes par 'nom' par minute, donc cette approche devrait être suffisante même si elle est inélégante. L'alternative serait de garder une deuxième table avec seulement la dernière entrée pour chaque 'nom' dedans ... et de supprimer cette table de temps en temps pour supprimer les enregistrements vieux d'une minute.

1

Je pense que j'ai trouvé une solution décente. Le problème était dans mon modèle:

date = db.DateTimeProperty(auto_now_add=True) 

Cela signifie que pour chaque instance de ce modèle, les datetimes seraient tous légèrement différents. Cela rend le regroupement de mes données très difficile. Donc, dans ma fonction cron, je me suis assuré que chaque demande d'api avait le même horodatage.

La modification suivante consistait à créer une table en cours. Chaque fois que le cron s'exécute, il supprime tout dans la table en cours (une seule ligne) et ajoute une nouvelle ligne. Cette nouvelle ligne est ensuite ajoutée à une table Log qui stocke de manière semi-permanente les résultats.

1

Certes, cela fonctionnerait:

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

Sinon, vous pouvez utiliser une inégalité, comme « date> 2009-04-11 00:50 », qui retournera tous les résultats après cette date.