当前位置:  开发笔记 > 编程语言 > 正文

从数据库中的列值生成直方图

如何解决《从数据库中的列值生成直方图》经验,为你挑选了3个好方法。

假设我有一个数据库列'grade',如下所示:

|grade|
|    1|
|    2|
|    1|
|    3|
|    4|
|    5|

在SQL中有一个非平凡的方法来生成这样的直方图吗?

|2,1,1,1,1,0|

其中2表示1级出现两次,1表示等级{2..5}出现一次,0表示等级6根本不出现.

我不介意直方图是否每个计数一行.

如果这很重要,数据库是由perl CGI通过unixODBC/FreeTDS访问的SQL Server.

编辑:谢谢你的快速回复!如果我可以确定哪个直方图值属于哪个等级,则不存在不存在的值(如上例中的等级6)是可以的.



1> Ilya Volodin..:
SELECT COUNT(grade) FROM table GROUP BY grade ORDER BY grade

没有验证它,但它应该工作.但是,它不会显示6s等级,因为它根本没有出现在表中...



2> cjk..:

使用临时表来获取缺少的值:

CREATE TABLE #tmp(num int)
DECLARE @num int
SET @num = 0
WHILE @num < 10
BEGIN
  INSERT #tmp @num
  SET @num = @num + 1
END


SELECT t.num as [Grade], count(g.Grade) FROM gradeTable g
RIGHT JOIN #tmp t on g.Grade = t.num
GROUP by t.num
ORDER BY 1



3> KyleMit..:

如果数据点很多,还可以将范围分组在一起,如下所示:

SELECT FLOOR(grade/5.00)*5 As Grade, 
       COUNT(*) AS [Grade Count]
FROM TableName
GROUP BY FLOOR(Grade/5.00)*5
ORDER BY 1

此外,如果您想标记整个范围,可以通过CTE提前获得地板和天花板的标签。

With GradeRanges As (
  SELECT FLOOR(Score/5.00)*5     As GradeFloor, 
         FLOOR(Score/5.00)*5 + 4 As GradeCeiling
  FROM TableName
)
SELECT GradeFloor,
       CONCAT(GradeFloor, ' to ', GradeCeiling) AS GradeRange,
       COUNT(*) AS [Grade Count]
FROM GradeRanges
GROUP BY GradeFloor, CONCAT(GradeFloor, ' to ', GradeCeiling)
ORDER BY GradeFloor

注意:在某些SQL引擎中,您可以GROUP BY使用序数列索引,但是对于MS SQL,如果希望在SELECT语句中对其进行分组,则还需要对其进行分组,因此也将Range复制到Group Expression中。

选项2:您可以使用case语句有选择地将值计数到任意bin中,然后再取消透视它们以获取包含值的逐行计数

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有