我正在尝试编写一个查询,该查询将从表的每列产生非常小的数据样本,其中样本由前3个最常见的值组成 . 这个特殊问题是一项更大任务的一部分,即编写可以表征数据库及其表的脚本,数据完整性,并且还可以按列逐步调查表中的常见值 . 可以将其视为表格的自动“分析” .
在单列的基础上,我已经通过简单地计算值的频率然后按频率排序来做到这一点 . 如果我有一个名为“颜色”的列并且所有颜色都在其中,并且恰好在大多数行中颜色“蓝色”,那么最常出现的前1个值将是“蓝色” . 在SQL中很容易计算 .
但是,我不确定如何在多列上执行此操作 .
目前,当我对表的所有列进行计算时,我执行以下类型的查询:
USE database;
DECLARE @t nvarchar(max)
SET @t = N'SELECT '
SELECT @t = @t + 'count(DISTINCT CAST(' + c.name + ' as varchar(max))) "' + c.name + '",'
FROM sys.columns c
WHERE c.object_id = object_id('table');
SET @t = SUBSTRING(@t, 1, LEN(@t) - 1) + ' FROM table;'
EXEC sp_executesql @t
但是,我并不完全清楚我将如何做到这一点 .
(旁注:类型为text,ntext和image的列,因为这些会在计算不同的值时导致错误,但我不太关心解决这个问题)
但是每列最常见三个值的问题让我感到非常难过 .
理想情况下,我想最终得到这样的东西:
Col1 Col2 Col3 Col4 Col5
---------------------------------------------------------------------
1,2,3 red,blue,green 29,17,0 c,d,j nevada,california,utah
2 回答
我一起攻击这个,但它似乎工作:
我不能帮助,但认为我应该使用RANK() .
从这个SQL语句构建器开始,并根据自己的喜好进行修改:
EDIT 添加了按说明排序