WEB开发网      婵犻潧鍊婚弲顐︽偟椤栨稓闄勯柦妯侯槸閻庤霉濠婂骸浜剧紒杈ㄥ笚閹峰懘鎮╅崹顐ゆ殸婵炴垶鎸撮崑鎾趁归悩鐑橆棄闁搞劌瀛╃粋宥夘敃閿濆柊锕傛煙鐎涙ê鐏f繝濠冨灴閹啴宕熼鍡╀紘婵炲濮惧Λ鍕叏閳哄懎绀夋繛鎴濈-楠炪垽鎮归崶褍妲婚柛銊ュ缁傚秹鏁撻敓锟� ---闂佹寧娲╅幏锟�
开发学院数据库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 [复制链接] [打 印]
赞助商链接