2015-03-02 45 views
0

我正在爲我的項目使用SQLAlchemy,並且遇到需要複雜查詢的問題。我承認SQL不是我最強的套裝。我的問題是這樣的。SQL(鍊金術)查詢,獲取具有相同外鍵的所有條目的最新條目

有兩個表問題(父母)和一對多關係的變化。更改包含一個條目「changed_on」和一個外鍵「issue_id」,以及一個「新」值更改的「字段」。

(如 的變化可以有issue_id = 1, field='status', new='closed' changed_on='25/01/2012'issue_id = 1, field='status', new='resolved', changed_on='24/01/2012'

我要算多少這樣的變化,我們以前有過一個X日起,只得到了一個具有最新日期的(最新的是與查找日期相關)。

到目前爲止我的代碼之前的某一天X

for day in dates: 
     q2 = Change.session.query(func.count(Change.id)).\ 
      filter(Change.changed_on <= day, Change.field == attr, Change.new == value).all() 

這得到前「天」某一特定領域和價值的物品的正確的計數,但它並沒有考慮到,以獲得計數最新的更新值。

我意識到,在過濾我會砸Change.new == value但在那之後我如何過濾它得到的只是帶有Y的X更改的最新更新ISSUE_ID

編輯:

更好的辦法做到這將是每天都能像

{ 
'01/04/2015': { 
      'open' :10, 
      'closed' : 15....} 
    } 

但一些日子的字典的問題可以從新建 - >收走了,所以我們需要統計,只有關閉那些(LA測試更新)

回答

1

您需要將group_by添加到您的查詢中,以便按日期和狀態進行分組。 在SQL中,您需要使用GROUP BY語句按字段進行計數。

query(
     IssueChange.changed_on, 
     Change.new, 
     func.count(Change.id), 
    ).filter(
     IssueChange.changed_on <= day, 
     Change.field == attr, 
     Change.new == value 
    ).group_by(
     IssueChange.changed_on, 
     Change.new 
    ).all() 

而且您將收到輸出是這樣的:

[ 
('24/01/2012', 'resolved', 3), 
('24/01/2012', 'closed', 2), 
('25/01/2012', 'resolved', 5), 
('25/01/2012', 'closed', 5) 
] 

補充說:

如果你想一行每日期,你可以使用SQL子查詢,如:

SELECT parent.changed_on, 
    (SELECT COUNT(child.id) FROM change AS child WHERE child.changed_on = parent.changed_on AND child.new == 'resolved') AS Resolved, 
    (SELECT COUNT(child.id) FROM change AS child WHERE child.changed_on = parent.changed_on AND child.new == 'closed') AS Closed 
FROM change AS parent 

但是在SQLAlchemy中它是相當棘手的...(

+0

相當正確的方式。謝謝! 但這會重複計算issue_id相同的問題,對吧? 有什麼辦法如果添加ISSUE_ID選擇和組你特定問題的數量來獲得與同ISSUE_ID所有更改的條目,並只計算「最新」 – MayTheSchwartzBeWithYou 2015-03-02 14:56:19

+1

@MayTheSchwartzBeWithYou : 查詢(Change.Issue_id ... ).filter(Change.changed_on> '22/01/2012',....)。group_by(Change.issue_id,... [在select中的其他字段]) – denex 2015-03-03 09:52:29

+0

非常感謝@denex。我用數據結構和你的指導解決了它。我明天會發布解決方案。 乾杯 – MayTheSchwartzBeWithYou 2015-03-04 23:44:47

相關問題