gpt4 book ai didi

sql-server - 划分结果以运行总计查询

转载 作者:行者123 更新时间:2023-12-03 20:59:34 25 4
gpt4 key购买 nike

我正在寻找一种在大型SQL Server 2008数据集中创建累计总数的快速方法,该数据集可以按特定列进行分区,可能使用多个赋值变量解决方案。作为一个非常基本的示例,我想在下面创建“ cumulative_total”列:

user_id | month | total | cumulative_total

1 | 1 | 2.0 | 2.0
1 | 2 | 1.0 | 3.0
1 | 3 | 3.5 | 8.5

2 | 1 | 0.5 | 0.5
2 | 2 | 1.5 | 2.0
2 | 3 | 2.0 | 4.0


传统上,我们是使用相关子查询来完成此操作的,但是在大量数据(200,000多行和几种不同类别的运行总计)上,这不能为我们提供理想的性能。

我最近在这里阅读了有关使用多个赋值变量进行累加求和的信息:

http://sqlblog.com/blogs/paul_nielsen/archive/2007/12/06/cumulative-totals-screencast.aspx

在该博客的示例中,累积变量解决方案如下所示:

UPDATE my_table
SET @CumulativeTotal=cumulative_total=@CumulativeTotal+ISNULL(total, 0)


在上述示例中,对于单个用户(用户1或用户2)进行求和,此解决方案的速度似乎非常快。但是,我需要按用户进行有效分区-按月给我累计用户总数。

有谁知道一种扩展多重赋值变量概念来解决此问题的方法,或者除相关子查询或游标之外的其他任何思想?

非常感谢您提供任何提示。

最佳答案

SQL Server 2008中的选项受到相当有限的限制-您可以基于上述方法执行某项操作(称为“快速更新”),也可以在CLR中执行某些操作。

就个人而言,我会选择CLR,因为它可以保证正常工作,而正式支持的语法却不支持古怪的更新语法(因此将来的版本中可能会破坏)。

您要查找的古怪更新语法的变化形式如下:

UPDATE my_table
SET @CumulativeTotal=cumulative_total=ISNULL(total, 0) +
CASE WHEN @user=@lastUser THEN @CumulativeTotal ELSE 0 END,
@user=lastUser


值得注意的是,SQL Server 2012在窗口功能中引入了对 RANGE的支持,因此这是最有效的方式,而且得到100%支持。

关于sql-server - 划分结果以运行总计查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10832067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com