WEB开发网
开发学院数据库MSSQL Server SQL Server 2005生成直方图简介 阅读

SQL Server 2005生成直方图简介

 2007-05-15 09:33:00 来源:WEB开发网   
核心提示: SELECT step, count(*) AS cntFROM Samples JOIN () AS StepsON value > f AND value = @fromdt AND dt如果您像我一样喜欢使用模块化的开发方法来简化代码及其维护,则可以编写一个用户定义函数 (UD

SELECT step, count(*) AS cnt

FROM Samples JOIN () AS Steps

ON value > f AND value = @fromdt AND dt

如果您像我一样喜欢使用模块化的开发方法来简化代码及其维护,则可以编写一个用户定义函数 (UDF),该函数将等级数、度量 ID 和日期范围作为参数,并返回表 Steps。运行 清单 6 显示的代码来创建 fn_steps 函数。

要测试该函数,请运行下面的代码:

SELECT * FROM fn_steps(1, 5, '20030101', '20030102')

现在,您可以使用 fn_steps 表,而不是派生表 Steps,如 清单 7 中的代码所示。

解决方案 2:实时计算等级号

这个难题还有另一个解决方案,该方案不生成等级表,而是实时计算等级号。利用此解决方案时,您无需使用等级号辅助表。请注意 清单 8 (第 18 页)的标注 A 中的 FROM 子句。您将交叉连接两个派生表 — 一个表名为 S,包含来自 Samples 的、与提供的参数相匹配的行,另一个表名为 R,包含最小度量值和整个范围的大小。下面的表达式(在 SELECT 列表中进行编写)用于计算等级号:

floor((value-mn) / (1.0*range/@numsteps)) + 1

AS step

此表达式使用的逻辑与您在前面的解决方案中用于计算上限和下限的逻辑很相似。表达式 (value-mn) 可计算出值在范围内的位置,而 (1.0*range/@numsteps) 可计算出等级大小。用第二个操作数除以第一个操作数,在结果的基础上再加上 1,就可以得出等级号。既然您已经向每行附加了一个等级号(匹配来自 Samples 表的条件),那么您就可以在名为 RS 的派生表中使用此查询,从而能够按计算出的等级号对结果进行分组。清单 8 显示了完整的解决方案,在该解决方案中,外部查询按等级号对结果进行分组,并计算每个等级的行数。

上一页  1 2 3 4 

Tags:SQL Server 生成

编辑录入:coldstar [复制链接] [打 印]
赞助商链接