计数窗口函数 MySQL 中每个分区的最大计数

Posted

技术标签:

【中文标题】计数窗口函数 MySQL 中每个分区的最大计数【英文标题】:max count for each partition in count windowing function MySQL 【发布时间】:2020-07-17 07:52:27 【问题描述】:

我正在使用 mysql 8.0

我有一张如下所示的表格:

id     user_id        item_id              time
1        3111           4423         2020-06-01 01:00:00
2        3111           4423         2020-06-01 02:00:00
3        2971           36           2020-06-01 01:00:00
4        2971           36           2020-06-01 02:00:00
5        2971           36           2020-06-01 03:00:00
6        2971           815          2020-06-01 22:00:00

我正在尝试按 user_id、item_id 进行分区并创建一个列来计算该分区的行数。

我已经完成了:

select *
     , count(id) over(partition by user_id, item_id order by time) as cnt
  from table

这个输出:

id     user_id        item_id              time               cnt
1        3111           4423         2020-06-01 01:00:00       1
2        3111           4423         2020-06-01 02:00:00       2
3        2971           36           2020-06-01 01:00:00       1
4        2971           36           2020-06-01 02:00:00       2
5        2971           36           2020-06-01 03:00:00       3
6        2971           815          2020-06-01 22:00:00       1

这几乎是我想要的,但是我想要每个分区的最大 cnt 值。

期望的输出:

id     user_id        item_id              time               cnt
1        3111           4423         2020-06-01 01:00:00       2
2        3111           4423         2020-06-01 02:00:00       2
3        2971           36           2020-06-01 01:00:00       3
4        2971           36           2020-06-01 02:00:00       3
5        2971           36           2020-06-01 03:00:00       3
6        2971           815          2020-06-01 22:00:00       1

提前致谢。

编辑:

这仍然输出相同的结果...

SELECT *
     , max(cnt) over(partition by user_id, item_id order by time) as max_cnt
  FROM ( select *
              , count(id) over(partition by user_id, item_id order by time) as cnt
          from table) subtable;

【问题讨论】:

【参考方案1】:

只需从调用COUNT 中删除ORDER BY 子句:

SELECT *, COUNT(id) OVER (PARTITION BY user_id, item_id) AS cnt
FROM yourTable;

以这种方式使用COUNT 只会返回每个用户/项目分区的记录总数,这似乎是您想要的。

【讨论】:

以上是关于计数窗口函数 MySQL 中每个分区的最大计数的主要内容,如果未能解决你的问题,请参考以下文章

重置窗口函数的计数器

使用窗口函数计算滚动计数

窗口计数

Beam:使用窗口边界写入每个窗口元素计数

Hive SQL,在滑动 10 分钟窗口中找到最大计数

VBA - 最大化第二个窗口的连接范围计数不正确