mysql是否具有Oracle的“分析功能”?

时间:2012-08-04 06:41:16

标签: mysql sql database oracle

我正在寻找MySQL中的PARTITION BY等分析函数(更多信息请参见docs

  

分析函数根据一组计算聚合值   行。它们与聚合函数的不同之处在于它们返回   每组多行。

它存在吗?

4 个答案:

答案 0 :(得分:17)

只是想告诉你,你可以在MySQL中使用变量来模仿分析函数。例如,SUM OVER可以按如下方式完成:


SELECT amount, 
    @sum := @sum + amount as sum 
FROM tbl
JOIN (SELECT @sum := 0) s

如果你想要PARTITION BY,它可能会有点复杂。基本上,您添加另一个@variable来观看帐户(或您要分区的任何内容),按帐户(或您的变量)排序,然后在帐户更改时重置@sum。如下:


SELECT account, 
    amount, 
    (case when @account != account then @sum := amount else @sum := @sum + amount end) as sum,
    (case when @account != account then @account := account else @account end) as _
FROM (SELECT * FROM tbl ORDER BY account)
JOIN (SELECT @sum := 0) s
JOIN (SELECT @account := '') a

您将注意到为完成分区效果必须进行的两项重大更改:

  1. 主表(tbl)包含在带有ORDER BY子句的子选择中。这是必要的,因为当MySQL进行@account变量测试时,需要对已经订购的值进行测试。如果没有发生这种情况,您将获得不正确的总和值以及帐户值。

  2. 有一个'额外'列别名as _。您可以在使用结果时忽略此列,但@account检查和更改的顺序需要在@sum检查和更改之后。

    此外,如果您不介意帐户是最后一个,您可以选择重新排序列。这是通过取出第一个account列完成的,因为它与最后一个_列重复,然后显然将别名_重命名为account

  3. <强>资源:

答案 1 :(得分:15)

不,与其他DBMS(如MSSQL,Oracle,PostgreSQL)相比,它是MySQL的主要缺点之一。我强烈怀疑在任何未来都会看到MySQL中的Window Functions,特别是在Oracle收购MySQL之后......

更新04/2018

MySQL 8.0现在支持window functions

答案 2 :(得分:0)

虽然MySQL不支持分析函数,但MariaDB却支持。它是MySQL的直接替代品,由MySQL的原始开发人员创建。

答案 3 :(得分:-5)

SQL Server的商业产品提供数据库内分析功能,可以通过“链接服务器”/ odbc连接到oracle或MySQL数据库 - 这是一篇描述它的文章: http://westclintech.com/Blog/tabid/132/EntryId/88/Using-XLeratorDB-with-MySQL-and-other-RDBMS-s.aspx

这需要Windows o / s和SQL Server 2005或更高版本(Express版本是免费的)