繁体   English   中英

如何使用列中的不同值创建表作为新表的列名?

[英]How can I create a table using distinct values from a column as the column names for the new table?

我有一个带有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 ...

更新:

我知道限制(关于表中的列数),但是列不会稀疏,并且任何列中都不会有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;

在这里看到它:


但是,在您的情况下,您必须使用动态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);

在这里看到它:

这将创建一个名为newtablename全新表,如下所示:

| TAG1 | TAG2 | TAG3 | TAG4 |
-----------------------------
|  123 |  854 |  923 |   44 |

这个评论太长了。

普通SQL Server表中的最大列数为1,024(请参见此处 )。

您的请求危险地接近极限。 因此,尽管技术上可行,但强烈建议不要这样做。 我不确定Mahmoud为什么删除了他的答案,因为这个答案似乎是正确的。

如果大多数值为0 / NULL,您可以调查包含“稀疏列”的称为“宽表”的内容。

如果您解释为什么要进行此调整,那么可能还有其他解决方案可以解决您的问题。

哦,我非常同情想要用SQL中的数据进行数据分析。 这里通用选项:

(1)将数据导入SAS,SPSS或R.这些对列数没有任意限制。

(2)将值连接成一列,也许用逗号分隔。 然后可以很容易地将其带入另一个工具中。

(3)使用对列数有较高限制的数据库,例如Oracle或MySQL(仍然有较低的限制,但稍微好一些)。

(4)使用称为垂直分区的技术将列放在单独的表中。 由Vertica等数据库直接支持。 可以由其他数据库实现。 但是,您遇到了查询中允许的最大列数问题。

对于您的特定问题,我强烈建议您研究一下群集算法。 K-means可能不会在如此广泛的数据上给出非常好的结果。 我不知道SSAS是否支持EM集群,这可能会更好一些。 您可以尝试将分析转换为关联规则问题。 但是,严肃的方法是使用主成分转换数据并在较低维空间中进行聚类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM