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的内容,我可以删除它。