我想告诉你,在MySQL中可以使用变量来模拟分析函数。例如,SUM OVER可以按以下方式完成:
SELECT amount,
@sum := @sum + amount as sum
FROM tbl
JOIN (SELECT @sum := 0) s
这段代码是用于查询 `tbl` 表中的 `amount` 字段,并计算它们的总和。使用了 MySQL 中的用户变量 `@sum` 来保存当前的累加值,并在每次迭代时更新该值。`JOIN (SELECT @sum := 0)` 是为了初始化该变量。如果您想使用 PARTITION BY
,这是可能的,但会更加复杂。基本上,您需要添加另一个 @variable
来监控账户(或任何您想要分区的内容),按照账户(或您的变量)排序,然后在账户更改时重置 @sum
。如下所示:
SELECT account,
amount,
(当@account != account时,则@sum := amount,否则@sum := @sum + amount) as sum,
(当@account != account时,则@account := account,否则@account) as _
FROM (按account排序的SELECT * FROM tbl)
JOIN (SELECT @sum := 0) s
JOIN (SELECT @account := '') a
要实现分区效果,需要进行两个主要改变:
将主表(tbl
)放在一个带有ORDER BY
子句的子查询中。这是必要的,因为当MySQL执行@account
变量测试时,需要对值进行排序。如果不这样做,您将得到错误的汇总值和账户值。
存在一个附加的列别名为as _
。使用结果时可以忽略此列,但是需要在@sum
检查和更改之后进行@account
检查和更改。
另外,如果您不介意将账户列放在最后,还可以重新排列列的顺序。这可以通过删除第一个account
列并明确命名别名为account
的_
列来实现。
资源:
不,这是MySQL的主要缺点之一,与MSSQL、Oracle、PostgreSQL等其他DBMS相比。我强烈怀疑未来会在MySQL中看到窗口函数,尤其是在Oracle收购MySQL之后...
更新于04/2018
MySQL 8.0现在支持窗口函数了。
尽管MySQL不支持分析函数,MariaDB支持。它是MySQL的一个可替代品,由MySQL的原始开发人员创建。
有一款商业产品适用于SQL Server,提供了数据库内分析功能,并且可以通过“链接服务器”/odbc连接到Oracle或MySQL数据库 - 这里是一篇描述它的文章: http://westclintech.com/Blog/tabid/132/EntryId/88/Using-XLeratorDB-with-MySQL-and-other-RDBMS-s.aspx
这需要使用Windows操作系统和SQL Server 2005或更高版本(其中Express版本是免费的)。