Отличается от Group By, не работает в SQLAlchemy - PullRequest
0 голосов
/ 14 ноября 2018

Моя проблема в том, как я должен использовать 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 голосов
/ 14 ноября 2018

Прочитав этот пост о вложенном запросе, я понял, что есть решение моего вопроса.

Имя таблицы в БД: 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, я всегда видел, как оно использовалось!

Любая помощь или направлениетакже ценится!

...