将列连接到行
Posted
技术标签:
【中文标题】将列连接到行【英文标题】:Join columns to rows 【发布时间】:2016-03-19 17:00:48 【问题描述】:假设你有一个表 Table1 列
用户ID、项目1、项目2、项目3、项目4、项目5、项目6、项目7、项目8、项目9、项目10
你有另一个表 Table2 和
用户 ID、项目 ID、名称
。 Table1 中的值是 Table2 中的 ItemId。我有需要展示
用户 ID、项目 ID、名称
其中 Item1 是第一个,Item10 是最后一个,您有 10 行。换句话说,Item1 是第一行,Item10 是最后一行。如果有任何方法可以避免 CASE WHEN,那就太好了。将来我可能会有更多列,并且不愿意对这 10 列进行硬编码。
【问题讨论】:
如果 table2 已经拥有所有需要的信息,那么 table1 的意义何在?只是为了订购 Table2 中的项目吗?如果是这样,为什么不只有一个订单列? Table1 来自 AzureML 推荐引擎。我无法控制它如何输出数据。因此,对于每个用户,它会创建 10 个推荐项目。我需要根据我的 Table2 在屏幕上显示这些建议。表 1 中的 Item1 是最推荐的,Item10 是最不推荐的。希望它清除它。 这是机器学习还是 TSQL 问题?你为什么提到机器学习? 【参考方案1】:我认为在这种情况下您需要一个 反向枢轴。您不像在普通支点中那样使用 CASE,而是使用 UNION ALL
,如下所示:
select Table1.UserId, Table2.ItemId, Table2.Name
from Table1 inner join Table2 on Table1.Item1 = Table2.ItemId
UNION ALL
select Table1.UserId, Table2.ItemId, Table2.Name
from Table1 inner join Table2 on Table1.Item2 = Table2.ItemId
UNION ALL
...
select Table1.UserId, Table2.ItemId, Table2.Name
from Table1 inner join Table2 on Table1.Item10 = Table2.ItemId
如果您有更多项目,您还应该能够编写一个生成重复 UNION ALL
语法的 sn-p,这样您就不必全部手动输入。
【讨论】:
【参考方案2】:鉴于您可以完全绕过 SQL,我强烈建议您使用例如R 或 Python 以 ML 可用的方式处理事务。具有收集功能的 tidyr 包正是您想要做的。
另一种方法是交叉制表。使用 SQL 标准派生解决方案绝对没问题,但是在 R 或 Python 中可以更轻松地解决很多问题。
【讨论】:
我同意,我现在有一个 sql 编写器,但没有找到如何使用 collect 函数或 tidyr 包的文档,所以即使我完全同意,我还是求助于 sql。【参考方案3】:只有 3 列的 table1
userid, itemid, sequence
会更有利于您的目的。您将需要从单行转换您的 AzureML 输出
Uid1, itm1,itm2,itm3,...,itm10
分成10行
Uid1, itm1, 1
Uid1, itm2, 2
Uid1, itm3, 3
...
Uid1, itm10,10
假设您将上述输出行作为 AzureML 名称为 tbla
的(临时)表输出,您可以使用以下 UNION ALL
构造(如 Spencer Simpson 所建议的那样):
INSERT INTO table1 (userid, itemid, sequence)
SELECT uid, itm1, 1 FROM tbla UNION ALL
SELECT uid, itm2, 2 FROM tbla UNION ALL
SELECT uid, itm3, 3 FROM tbla UNION ALL
SELECT uid, itm4, 4 FROM tbla UNION ALL
...
SELECT uid, itm10, 10 FROM tbla
要将信息存储到table1
,这将是您必须处理的唯一表。不再需要JOIN
s。
注意:我不太确定您的专栏 name
与什么相关。是商品名还是用户名?
在这两种情况下,都应该有第二个表 table2
来处理 name
和 userid
/itemid
之间的对应关系
itm/usr name
然后,此表将被 join
编辑到任何需要显示 name
列的查询中。
【讨论】:
【参考方案4】:解决此问题的方法是使用 Python(或 R)并使用 melt
函数。
数据框中还有一个pivot_table
函数。
因此,您可以将列转换为行。然后在另一个表上加入这些行。
Reshaping and Pivot Tables
【讨论】:
以上是关于将列连接到行的主要内容,如果未能解决你的问题,请参考以下文章