首页 > 解决方案 > 按累积分组计算的不同项目数

问题描述

我有以下查询,它对每个所有者进行不同的项目计数,按月分组

询问:

SELECT owner, Month(date) AS month, Count(DISTINCT( item )) AS cnt
        FROM   table_name
        WHERE  impact < 3
               AND group IN ( 'Group1', 'Group2', 'Group3')
               AND date >= '2019-01-01'
               AND date <= '2019-05-02 23:59:59'
        GROUP  BY owner, month
        ORDER  BY owner, month; 

这会为每个所有者生成每个月的不同项目计数。我想要的是每个所有者累积月份的不同项目计数。对于 2 月,我想要从 1 月到 2 月每个所有者的不同项目计数。对于 3 月,我想要从 1 月到 3 月的每个所有者的不同项目计数,依此类推。有人可以帮忙解决这个问题吗?

标签: mysqlsqldatabase

解决方案


如果我理解正确,您需要基于该项目第一次出现在所有者面前的累积计数。在 MySQL 8+ 中,您可以使用窗口函数:

SELECT owner, Month(date) AS month,
       COUNT(*) as this_month_cnt,
       SUM(COUNT(*)) OVER (PARTITION BY owner ORDER BY MONTH(date)) as running_cnt
FROM  (SELECT t.owner, t.item, MIN(t.date) as date
       FROM table_name
       WHERE impact < 3 AND
             group IN ( 'Group1', 'Group2', 'Group3') AND
             date >= '2019-01-01' AND
             date < '2019-05-03'
       GROUP  BY owner, item
      ) t
GROUP BY owner, month
ORDER  BY owner, month; 

推荐阅读