2010-06-15 11 views
6

Also habe ich eine Tabelle mit einem Datumsstempel und zwei Felder, die ich sicherstellen möchte, dass sie im letzten Monat einzigartig sind.SQLAlchemy: Wie man nach zwei Feldern gruppiert und nach Datum sortiert

Es sollte keinen doppelten Datensatz mit dem gleichen Feld1 + 2 zusammengesetzten Wert im letzten Monat geben.

Die Schritte in meinem Kopf sind:

  1. Gruppe durch die beiden Felder
  2. im letzten Monat der Daten Blick zurück diese einzigartige Gruppierung tritt nicht auf, um sicherzustellen.

Ich habe so weit gekommen, aber ich glaube nicht, das funktioniert:

result = session.query(table).group_by(\ 
    table.field1, 
    table.field2, 
    func.month(table.timestamp)) 

Aber ich bin nicht sicher, wie dies in sqlalchemy zu tun. Könnte mir jemand raten?

Vielen Dank!

+0

Vielen Dank im Voraus, Jungs – 0atman

Antwort

15

Nach sollten Sie in der richtigen Richtung, siehe auch Inline-Kommentare:

qry = (session.query(
       table.c.field1, 
       table.c.field2, 
       # #strftime* for year-month works on sqlite; 
       # @todo: find proper function for mysql (as in the question) 
       # Also it is not clear if only MONTH part is enough, so that 
       # May-2001 and May-2009 can be joined, or YEAR-MONTH must be used 
       func.strftime('%Y-%m', table.c.datestamp), 
       func.count(), 
       ) 
     # optionally check only last 2 month data (could have partial months) 
     .filter(table.c.datestamp < datetime.date.today() - datetime.timedelta(60)) 
     .group_by(
       table.c.field1, 
       table.c.field2, 
       func.strftime('%Y-%m', table.c.datestamp), 
       ) 
     # comment this line out to see all the groups 
     .having(func.count()>1) 
    ) 
+0

Vielen Dank van aber Ihre Lösung stochert Löcher in meinem sqlalchemy Wissen, was ist die Bedeutung von das Attribut 'c' des Tabellenobjekts? – 0atman

+0

Wenn Sie ein 'table' Objekt haben, dann ist' c' eine Abkürzung für 'columns'. Siehe SQL Expression Language Tutorial: http://www.sqlalchemy.org/docs/sqlexpression.html?highlight=group_by#Ordering-grouping-limiting-offset-ing – van

+0

Keine Sorge, ich hätte einfach meine Frage googeln sollen so oft ist es so! – 0atman

Verwandte Themen