Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 分组方式不同';在炼金术中不起作用_Python_Sql_Sqlite_Sqlalchemy_Distinct - Fatal编程技术网

Python 分组方式不同';在炼金术中不起作用

Python 分组方式不同';在炼金术中不起作用,python,sql,sqlite,sqlalchemy,distinct,Python,Sql,Sqlite,Sqlalchemy,Distinct,我的问题是如何使用distint(),根据一列的值删除/忽略数据库中重复的行。这是我的设想 我有一个数据库,名为test\u db,包含以下数据: values_list = [ {'tweet_id': '1', 'retweet': '100', 'user_id': '101'}, {'tweet_id': '2', 'retweet': '10', 'user_id': '101'}, {'tweet_id': '2', 'retweet': '11',

我的问题是如何使用
distint()
,根据一列的值删除/忽略数据库中重复的行。这是我的设想

我有一个数据库,名为
test\u 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\u id
的每个用户的转发次数和tweet次数求和。我对这个问题的质询如下:

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)
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)
我得到的结果如下:

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
,以获得预期的结果,或者是否有其他方法解决此问题

谢谢

通过阅读嵌套查询,我意识到我的问题有一个解决方案

数据库中的表名为
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中的等效转换溶液如下所示:

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)
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
一起使用,这就是我一直看到它使用的方法


任何帮助或指导也将不胜感激

选择
tweet\u id
等于2且
user\u id
101的一行或另一行的逻辑是什么?我可以理解这些值是否有时间戳,您可以选择最新的值等。正如我在预期结果中所示,我选择了最大转发,但我不在乎选择哪一个。在这种情况下,我只想知道区分应该如何工作。请注意,
tweet\u id
最终将是不确定的。你完全正确。对于这个例子,我不关心tweet\u id的内容,我可以删除它。