2010-06-15 49 views
6

Vì vậy, tôi có bảng có dấu thời gian và hai trường mà tôi muốn đảm bảo rằng chúng là duy nhất trong tháng trước.SQLAlchemy: Cách nhóm theo hai trường và lọc theo ngày

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

Sẽ không có bản ghi trùng lặp nào có cùng giá trị trường 1 + 2 trong tháng trước.

Các bước trong đầu tôi là:

  1. Nhóm do hai lĩnh vực
  2. Nhìn lại trên dữ liệu của tháng trước để đảm bảo nhóm độc đáo này không xảy ra.

Tôi đã có này, nhưng tôi không nghĩ rằng công trình này:

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

Nhưng tôi không chắc chắn làm thế nào để làm điều này trong SQLAlchemy. Ai đó có thể khuyên tôi không?

Cảm ơn rất nhiều!

+0

Cảm ơn trước, guys – 0atman

Trả lời

15

Tiếp theo nên chỉ cho bạn đi đúng hướng, cũng thấy ý kiến ​​inline:

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

Cảm ơn rất nhiều van, tuy nhiên giải pháp của bạn chọc lỗ hổng trong kiến ​​thức SQLAlchemy của tôi, tầm quan trọng của là gì thuộc tính 'c' của đối tượng bảng? – 0atman

+0

nếu bạn có đối tượng 'table', thì' c' là một phím tắt cho 'cột'. Xem hướng dẫn ngôn ngữ biểu thức SQL: http://www.sqlalchemy.org/docs/sqlexpression.html?highlight=group_by#ordering-grouping-limiting-offset-ing – van

+0

Đừng lo lắng, tôi nên chỉ googled câu hỏi của tôi, như thường xuyên như vậy! – 0atman

Các vấn đề liên quan