【问题标题】:how to do a iterative rollup in sql如何在sql中进行迭代汇总
【发布时间】:2009-09-18 14:31:43
【问题描述】:

嗨,我想根据滚动总和(valy)的前一行值和 valx 的当前行值做一个滚动总和(valx)

valy=previousrow_valy + valx

animal valx valy 
cat    1    1 
cat    3    4 
cat    2    6 
dog    4    4 
dog    6    10 
dog    7    17 
dog    8    25 

【问题讨论】:

    标签: sql iteration rollup


    【解决方案1】:

    你应该在这里定义一个订单。

    假设您想通过somecolumn 订购。

    OraclePostgreSQL 8.4

    SELECT  animal, valx, SUM(valx) OVER (PARTITION BY animal ORDER BY somecolumn) AS valy
    FROM    mytable
    

    MySQL:

    SELECT  animal, valx,
            @valy := CASE WHEN @animal = animal THEN @valy + valx ELSE valx END AS valy,
            @animal := animal
    FROM    (
            SELECT  @valy = 0,
                    @animal := NULL
            ) vars,
            mytable
    ORDER BY
            animal, somecolumn
    

    SQL Server 中,创建CURSOR 效率更高是罕见的情况之一。

    所有数据库(包括SQL Server)都支持ANSI语法:

    SELECT  animal, valx,
            (
            SELECT  SUM(valx)
            FROM    mytable mi
            WHERE   mi.animal = mo.animal
                    AND mi.somecolumn <= mo.somecolumn
            ) AS valy
    FROM    mytable mo
    

    但是,如果mytable 中有很多记录,则效率不高,执行时间会随着O(n^2) 的增加而增加

    【讨论】:

    • SQL Server 的最后一次查询返回的数据与输入表中的数据完全相同。
    • @Quassnoi 如果您有时间看看您是否认可我提供的替代方法,请看看我的回答。我很欣赏你在 stackoverflow 上的工作。
    • @Brian:到底是怎么交替的?
    • @Quassnoi 它正在使用分区,并且没有内联视图。内联视图只是提供示例数据,因此查询可以按原样执行。
    • @Brian:请仔细查看帖子中的第一个查询。
    猜你喜欢
    • 2017-06-21
    • 2016-07-10
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多