2010-06-15 26 views
6

Tak więc mam tabelę z datostamp i dwoma polami, które chcę mieć pewność, że są unikatowe w ostatnim miesiącu.SQLAlchemy: jak grupować według dwóch pól i filtrować według daty

table.id 
table.datestamp 
table.field1 
table.field2 

Nie powinno być żadnych duplikatów z tym samym polem1 + 2 wartość złożona w ostatnim miesiącu.

Kroki w głowie to:

  1. Grupa przez dwóch pól
  2. spojrzeć wstecz na danych z ostatniego miesiąca, aby upewnić się, że ta wyjątkowa grupa nie występuje.

mam tak daleko, ale nie sądzę, że to działa:

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

Ale jestem pewien, jak to zrobić w SQLAlchemy. Czy ktoś mógłby mi doradzić?

Dziękuję bardzo!

+0

Z góry dzięki, chłopaki – 0atman

Odpowiedz

15

obserwuję powinien wskazać we właściwym kierunku, a także zobaczyć inline komentarze:

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

Dzięki bardzo van, jednak rozwiązanie wyśmiewa dziury w mojej wiedzy sqlalchemy, co ma znaczenie atrybut "c" obiektu tabeli? – 0atman

+0

jeśli masz obiekt 'table', to' c' jest skrótem do 'columns'. Zobacz Samouczek w języku SQL Expression: http://www.sqlalchemy.org/docs/sqlexpression.html?highlight=group_by#ordering-grouping-limiting-offset-ing – van

+0

Nie martw się, powinienem po prostu wpisać w Google moje pytanie, tak często się dzieje! – 0atman

Powiązane problemy