在SQLAlchemy中无法区分分组依据

时间:2018-11-14 03:21:12

标签: python sql sqlite sqlalchemy distinct

我的问题是我应该如何使用distint()来基于一列的值来删除/忽略数据库中行的重复项。所以这是我的情况。

我有一个test_db数据库,其中包含以下数据:

values_list = [
    {'tweet_id': '1', 'retweet': '100', 'user_id': '101'},
    {'tweet_id': '2', 'retweet': '10', 'user_id': '101'},    
    {'tweet_id': '2', 'retweet': '11', 'user_id': '101'},        
    {'tweet_id': '10', 'retweet': '110', 'user_id': '102'},            
    {'tweet_id': '10', 'retweet': '110', 'user_id': '102'},                
    {'tweet_id': '110', 'retweet': '0', 'user_id': '2'},                    
]

我想对定义为user_id的每个用户的转发数和转发数求和。我对这样一个问题的查询如下:

q = select([
            test_db.columns.user_id,
            test_db.columns.tweet_id.distinct(),
            func.count(test_db.columns.retweet).label('count'),
            func.sum(cast(test_db.columns.retweet, Integer)).label('total_retweet'),
           ])
q = q.group_by(test_db.columns.user_id)

我得到的是以下内容:

user_id     tweet_id  count  total_retweet
102         10        2      220
101         2         3      121
2           110       1      0

但是我的预期结果应该是这样的:

user_id     tweet_id  count  total_retweet
102         10        1      110
101         2         2      111
2           110       1      0

我不确定应该如何执行distinct以获得预期的结果,或者还有另一种方法可以解决此问题。

谢谢!

1 个答案:

答案 0 :(得分:0)

通过阅读this post有关嵌套查询的信息,我意识到我的问题有解决方案。

数据库中的表名称为test,这是SQL格式的查询:

q = '''SELECT user_id, tweet_id, count(max_retweet) as count, 
                sum(max_retweet) as totat_retweet FROM 
                (SELECT tweet_id, max(cast(retweet as int)) as max_retweet, user_id FROM test
                GROUP BY user_id, tweet_id) 
            GROUP BY user_id
'''

因此,SQLAlchemy中等效的转换解决方案如下:

table = (
    select([
        func.max(test_db.columns.retweet).label('max_retweet'),
        test_db.columns.user_id,
        test_db.columns.tweet_id            
    ]).group_by(test_db.columns.user_id, test_db.columns.tweet_id)
    )

q = select([table.columns.user_id,
            table.columns.tweet_id,
            func.count(table.columns.max_retweet).label('count'),
            func.sum(table.columns.max_retweet).label('total_retweet')
             ])
q = q.group_by(table.columns.user_id)

但是我想知道是否有一个distinct表达式的解决方案,或者distinct应该始终与count一起使用,这就是我一直看到的解决方案!

任何帮助或指导也将受到赞赏!