繁体   English   中英

有没有办法在这个 MYSQL 查询中找到总和和累积计数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM