sql - 如何找到拥有最活跃卖家(每个用户每天软件销售量最高)的团队?

标签 sql postgresql group-by count

如何找到拥有最活跃卖家(每个用户每天软件销售量最高)的团队? 我想做类似这样的查询,但感觉不太安静

SELECT users.team_id, count(*) as sales FROM users
INNER JOIN activity ON users.user_id = activity.user_id
WHERE activity.sales = software
GROUP BY users.team_id
ORDER BY sale DESC

我的用户表如下所示:

user_id       team_id  
0               62  
1               32      
2               21      

虽然我的事件表如下所示:

user_id      sale_date              sale
1            2019-05-02 11:02:39    hardware    
2            2018-05-02 11:02:53    software    
2            2019-06-02 11:42:33    software

最佳答案

听起来这是一个逐步查询,所以让我们从最里面的部分开始:获取每个用户每天的销售计数。

SELECT sale_date, user_id, count(*) as sales
WHERE sale = 'software'
GROUP BY sale_date, user_id

然后我们就可以get the most active user for each day :

SELECT DISTINCT ON (sale_date) sale_date, user_id
FROM (
    SELECT sale_date, user_id, count(*) as sales
    WHERE sale = 'software'
    GROUP BY sale_date, user_id
) AS counts_by_date_and_user
ORDER BY sale_date, sales -- consider breaking ties somehow

然后我们可以计算用户当天最活跃的频率,按此排序,并获取他们的团队 ID。

SELECT team_id, user_id, count(*) as days
FROM (
    SELECT DISTINCT ON (sale_date) sale_date, user_id
    FROM (
        SELECT sale_date, user_id, count(*) as sales
        WHERE sale = 'software'
        GROUP BY sale_date, user_id
    ) AS counts_by_date_and_user
    ORDER BY sale_date, sales -- consider breaking ties somehow
) AS most_active
JOIN users USING (user_id)
GROUP BY user_id
ORDER BY days DESC

关于sql - 如何找到拥有最活跃卖家(每个用户每天软件销售量最高)的团队?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61030520/

相关文章:

mysql - SQL查询不适用于日期之间

sql - 如何在 postgresql 中对未知数量的 bool 值执行 AND?

postgresql - 用 Ecto 改变 Postgres search_path

sql - 不跳行的Postgresql GROUP BY?

mysql - 将两个计数查询合并为一个

php - 查询3张表,不重复

sql - 在多个客户端之间的 postgres 中实现宽松约束

sql - 如何遍历拆分字符串

c# - Linq GroupBy Max 并添加列

json - 使用jq进行多个级别的计数