【发布时间】:2015-05-14 20:58:32
【问题描述】:
我正在尝试编写一个查询,该查询将从表的每一列中生成非常小的数据样本,其中样本由前 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
【问题讨论】:
-
我不完全确定您要在这里做什么,但如果您想排除某些数据类型的列,您可以使用 system_type_id 列。如果您想要文字说明,请从 sys.columns 加入 sys.types。
-
@SeanLange 我更关心从表的所有列(任何表)中递归计算最频繁出现的值的问题
-
对...这就是我说的部分我不明白你在做什么。
-
OP 可能只是为数据分析或建模构建样本集。我过去做过。
-
@RajMore 确实如此。谢谢你!
标签: sql sql-server