【问题标题】:Is there a way to find the sum and the cumulative count in this MYSQL query?有没有办法在这个 MYSQL 查询中找到总和和累积计数?
【发布时间】:2020-08-08 10:13:06
【问题描述】:

我有这个 MYSQL 查询,用于在其关联表 members 中查找表 groups 随时间推移的累积增长。

  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 }
]

我需要这样做,以便稍后我可以轻松订购并找到成员数量最多的组。

有没有办法做到这一点?

【问题讨论】:

  • 请向我们展示您目前的结果,以及您想要的结果。

标签: mysql sql database sum window-functions


【解决方案1】:

只需将另一列添加到结果集中,对相同的partition 进行窗口计数,但没有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 持怀疑态度,因此我将其删除(尽管存在边缘情况,但将其与窗口函数一起使用几乎没有意义)-您可以添加它如果需要,请返回。

【讨论】:

  • 这行得通。我只是不明白人们如何直观地知道排序会导致窗口查询计算行中的总数。我的理解是窗口查询的全部意义在于你得到了单独的行,这似乎是一种随意的行为?我之所以与众不同,是因为在完整查询中,我将日期时间值四舍五入到当天,这会导致查询返回双精度值。
  • @Mattey 。 . .我不认为这真的能达到你想要的效果。如果我理解正确,它会为每个组/日期返回多行。我为您的问题推荐GROUP BY(这就是我回答的原因)。
【解决方案2】:

我会用显式聚合来写这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多