将列连接到行

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,这将是您必须处理的唯一表。不再需要JOINs。

注意:我不太确定您的专栏 name 与什么相关。是商品名还是用户名?

在这两种情况下,都应该有第二个表 table2 来处理 nameuserid/itemid 之间的对应关系

itm/usr   name

然后,此表将被 join 编辑到任何需要显示 name 列的查询中。

【讨论】:

【参考方案4】:

解决此问题的方法是使用 Python(或 R)并使用 melt 函数。 数据框中还有一个pivot_table 函数。

因此,您可以将列转换为行。然后在另一个表上加入这些行。

Reshaping and Pivot Tables

【讨论】:

以上是关于将列连接到行的主要内容,如果未能解决你的问题,请参考以下文章

将两个数据库列连接到一个结果集列

将pyspark列连接到pyspark DataFrame

如何将带有列表值的熊猫列连接到一个列表中?

如何在火花数据框中将列连接到一个

使用 Critera 或 QueryOver API 将一列连接到多个表

将一个表的两列连接到另一个表的一列