【问题标题】:How can i sum every N rows on maria db SQL?如何在 mariadb SQL 中对每 N 行求和?
【发布时间】:2017-06-07 03:33:07
【问题描述】:

我很难找到一种方法来对 maria db、SQL 表执行简单的加法。

我有一个名为 Traffic 的表:

| start_time        | end_time          | col1 | col2 |
| 1485075600.000000 | 1485075900.000000 | 10   | 20 |
| 1485075900.000000 | 1485076200.000000 | 20   | 30 |
| 1485076200.000000 | 1485076500.000000 | 40   | 50 |
| 1485076500.000000 | 1485076800.000000 | 50   | 60 |

如何对每 N 列求和(在 col1 和 col2 上)?

我的意思是,合并行并对 col1 和 col2 的值求和。

假设给定的表,并且 N = 2, 结果将是:

| start_time        | end_time          | col1 | col2|
| 1485075600.000000 | 1485076200.000000 | 30   | 50  |
| 1485076200.000000 | 1485076800.000000 | 90   | 110 |

如果表格大小不是 N 的倍数,请尽可能多地使用。

有人知道吗?我没有要分组的 ID。

【问题讨论】:

  • 哪个版本?我正在考虑窗口函数。

标签: mysql sql mariadb


【解决方案1】:

您可以通过枚举行来做到这一点。正确地说,您需要一个列来指定排序 -- SQL 表表示 unordered 集,因此它们需要一个列来进行排序。

让我假设它是start_time。剩下的只是聚合和算术:

select min(start_time) as start_time, max(end_time) as end_time,
       sum(col1) as col1, sum(col2) as col2
from (select t.*, (@rn := @rn + 1) as rn
      from traffic t cross join
           (select @rn := 0) params
      order by start_time
     ) t
group by floor( (rn - 1) / @N);

@N 值是组的大小。

【讨论】:

  • 谢谢!嘿,出于某种原因,当我执行它时,它会将所有行合并为一个。你能解释一下吗?
  • @Amit_A 。 . .你能设置一个 SQL Fiddle 吗?我在上面的代码中没有看到明显的错误。如果您遗漏了GROUP BY,如果@rn 没有正确初始化,或者如果您没有设置@N,就会发生这种情况(如果这是您想要的,只需将其替换为“2”。
  • 您好,再次感谢您的回复。我相应地更改了 N,但它不会改变结果。这是一个 sqlfile:sqlfiddle.com/#!9/a5855/2
猜你喜欢
  • 2020-04-03
  • 2017-02-18
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 2021-06-24
  • 2023-03-15
  • 2017-11-16
  • 1970-01-01
相关资源
最近更新 更多