2015-03-02 55 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

相关问题