[英]Is there a way to find the sum and the cumulative count in this MYSQL query?
我有这个 MYSQL 查询,我用它来查找表groups
在其关联表members
中的累积增长。
SELECT DISTINCT g.name, m.created_at,
COUNT(*) OVER(PARTITION by g.id ORDER BY m.created_at) count
FROM members m
INNER JOIN groups g on g.id = m.group_id
这给出了一个结果集,如:
[
{ 'group01', date: '2019-03-04', count: 5 },
{ 'group01', date: '2019-03-09', count: 12 }
{ 'group01', date: '2019-03-15', count: 23 }
{ 'group02', date: '2019-03-04', count: 3 }
{ 'group01', date: '2019-03-10', count: 19 }
{ 'group01', date: '2019-03-17', count: 27 }
]
我还将检索组成员的总数。 这样数据集将如下所示:
[
{ name: 'group01', date: '2019-03-04', count: 5, total: 23 },
{ name: 'group01', date: '2019-03-09', count: 12, total: 23 },
{ name: 'group01', date: '2019-03-15', count: 23, total: 23 },
{ name: 'group02', date: '2019-03-04', count: 3, total: 27 },
{ name: 'group02', date: '2019-03-10', count: 19, total: 27 },
{ name: 'group02', date: '2019-03-17', count: 27, total: 27 }
]
我需要这样做,以便稍后我可以轻松订购并找到成员最多的组。
有没有办法做到这一点?
只需在结果集中添加另一列,即对同一partition
进行 window 计数,但没有order by
子句; 这会导致数据库计算分区中的总行数:
SELECT g.name, m.created_at,
COUNT(*) OVER(PARTITION by g.id ORDER BY m.created_at) count,
COUNT(*) OVER(PARTITION by g.id) total
FROM members m
INNER JOIN groups g on g.id = m.group_id
注意:我对在SELECT
子句中使用DISTINCT
持怀疑态度,因此我将其删除(尽管存在极端情况,但将其与 window 函数一起使用几乎没有意义) - 如果需要,您可以将其添加回来。
我会用显式聚合来写这个:
SELECT g.name, m.created_at,
SUM(COUNT(*)) OVER (PARTITION BY g.id ORDER BY m.created_at) as count_on_day,
SUM(COUNT(*)) OVER (PARTITION BY g.id) as count_for_group
FROM members m INNER JOIN
groups g
ON g.id = m.group_id
GROUP BY g.name, m.created_at
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.