【问题标题】: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 问题?你为什么提到机器学习?

标签: sql-server tsql sql-server-2012


【解决方案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

      【讨论】:

        猜你喜欢
        • 2022-11-08
        • 1970-01-01
        • 1970-01-01
        • 2022-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-27
        • 1970-01-01
        相关资源
        最近更新 更多