Has*_*niH 3 sql t-sql sql-server pivot
我有一个带有Tag列的表,其中包含大约1000个不同的标记.我想为每个不同的标记创建一个包含列的新表,列名称将是标记值.使用T-SQL有一个很好的简单方法吗?SQL Server 2005及更高版本中的任何内容都可以.
这是我的意思的一个例子:
Table:
Tag Value Timestamp
tag1 123 ---
tag1 456 ---
tag2 854 ---
tag3 923 ---
.
.
.
tag90 324 ---
New Table:
tag1 tag2 tag3 ... tag90
123 854 923 324
456 ...
Run Code Online (Sandbox Code Playgroud)
更新:
我知道限制(关于表中的列数),但是列不会稀疏,并且任何列中都不会有null或0值.
我想要这个表的原因是我想对这个新表的列运行SSAS聚类算法.
使用PIVOT表运算符,然后使用该INTO子句从透视列创建新表.像这样的东西:
SELECT *
INTO newtablename
FROM ( SELECT tag, value FROM tags) AS t
PIVOT
(
MIN(value)
FOR tag in ([tag1], [tag2], [tag3], [tag4])
) AS p;
Run Code Online (Sandbox Code Playgroud)
在这里看到它:
但是,在您的情况下,您必须使用动态sql动态地为表中的任意数量的标记执行此操作,而不是手动列出它们.像这样:
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' +
QUOTENAME(tag)
FROM tags
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '');
SELECT @query = 'SELECT *
INTO newtablename
FROM ( SELECT tag, value FROM tags) AS t
PIVOT
(
MIN(value)
FOR tag in ( ' + @cols + ' )
) AS p';
execute(@query);
Run Code Online (Sandbox Code Playgroud)
在这里看到它:
这将创建一个全新的表,其名称newtablename如下所示:
| TAG1 | TAG2 | TAG3 | TAG4 |
-----------------------------
| 123 | 854 | 923 | 44 |
Run Code Online (Sandbox Code Playgroud)
这个评论太长了.
普通SQL Server表中的最大列数为1,024(请参见此处).
您的请求危险地接近极限.因此,尽管技术上可行,但强烈建议不要这样做.我不确定Mahmoud为什么删除了他的答案,因为这个答案似乎是正确的.
如果大多数值为0/NULL,您可以调查包含"稀疏列"的称为"宽表"的内容.
如果您解释为什么要进行此调整,那么可能还有其他解决方案可以解决您的问题.
哦,我非常同情想要用SQL中的数据进行数据分析.这里通用选项:
(1)将数据导入SAS,SPSS或R.这些对列数没有任意限制.
(2)将值连接成一列,也许用逗号分隔.然后可以很容易地将其带入另一个工具中.
(3)使用对列数有较高限制的数据库,例如Oracle或MySQL(仍然有较低的限制,但稍微好一些).
(4)使用称为垂直分区的技术将列放在单独的表中.由Vertica等数据库直接支持.可以由其他数据库实现.但是,您遇到了查询中允许的最大列数问题.
对于您的特定问题,我强烈建议您研究一下群集算法.K-means可能不会在如此广泛的数据上给出非常好的结果.我不知道SSAS是否支持EM集群,这可能会更好一些.您可以尝试将分析转换为关联规则问题.但是,严肃的方法是使用主成分转换数据并在较低维空间中进行聚类.
| 归档时间: |
|
| 查看次数: |
5039 次 |
| 最近记录: |