如何在 mysql 5.7 中使用 sum over partition(无窗口函数)
Posted
技术标签:
【中文标题】如何在 mysql 5.7 中使用 sum over partition(无窗口函数)【英文标题】:How to use sum over partition (withhout window function) in mysql 5.7 【发布时间】:2019-06-27 01:58:49 【问题描述】:我想知道 mysql 5.7 引擎如何与 sum over part 一样工作。 由于不是个人操作,无法替换查询引擎。
曾尝试通过@set 变量函数来解决它,但我发现很难获得四列中每一列的累积和。
我查看了下面的链接,但解决起来有点困难。 how to rank over partition in MySql
我的桌子
id a b c d
----------------------------
abs 1 0 0 1
abs 0 1 1 0
abs 1 0 1 0
abs 1 1 1 1
qwe 0 0 0 0
qwe 0 0 0 1
qwe 1 0 1 0
qwe 1 1 0 1
trx 0 1 1 0
trx 1 1 0 0
预期
id a b c d
----------------------------
abs 1 0 0 1
abs 1 1 1 1
abs 2 1 2 1
abs 3 2 3 2
qwe 0 0 0 0
qwe 0 0 0 1
qwe 1 0 1 1
qwe 2 1 1 2
trx 0 1 1 0
trx 1 2 1 0
提前致谢。
【问题讨论】:
感谢您以正确的方式纠正问题。 @Barbaros Özhan 【参考方案1】:您需要每列的累积总和。为了使它起作用,您需要一个指定排序的列——SQL 表代表 unordered 集。
假设您有这样一个列,那么以下通常会起作用:
select t.*,
(@a := if(@id = id, @a + a, 0)) as a,
(@b := if(@id = id, @b + b, 0)) as b,
(@c := if(@id = id, @c + c, 0)) as c,
(@d := if(@id = id, @d + d, 0)) as d,
@id := id
from (select t.*
from t
order by t.id, ? -- column for the ordering
) t cross join
(select @id := -1, @a := 0, @b := 0, @c := 0 @d := 0) params;
但是,这并不能保证起作用,因为 MySQL 不保证 SELECT
中表达式的求值顺序。所以,我认为子查询可能是最简单的方法:
select t.id,
(select sum(t2.a) from t t2 where t2.id = t.id and t2.? <= t.?) as a,
(select sum(t2.b) from t t2 where t2.id = t.id and t2.? <= t.?) as b,
(select sum(t2.c) from t t2 where t2.id = t.id and t2.? <= t.?) as c,
(select sum(t2.d) from t t2 where t2.id = t.id and t2.? <= t.?) as d
from t;
【讨论】:
谢谢!我会试试看我有一个排序列 - 时间戳 嗨,戈登,我试过了。但是,它没有用。错误信息:t 不存在我认为 t 是因为该表是我查询中的子查询。 @장수영 。 . .t
只是你的表名的占位符,问题中没有提到。以上是关于如何在 mysql 5.7 中使用 sum over partition(无窗口函数)的主要内容,如果未能解决你的问题,请参考以下文章
如何将 MySQL 5.5.40 升级到 MySQL 5.7
如何在MySQL 5.7中使用SELECT ... INTO语句导出数据文件?
如何使用 Homebrew 在 macOS BigSur (Apple Silicon) 上安装和启动 MySQL 5.7?