【问题标题】:Join on matching records and create combinations when no match加入匹配记录并在不匹配时创建组合
【发布时间】:2016-10-11 18:20:42
【问题描述】:

我正在尝试使用另外两个创建一个新表。我想在合并“值”列时创建所有记录组合的记录。我想要另一列告诉我值的来源 像这样。:

答:

Day    Month   Random1    Random2    value1 
01     Jan     AA         XX         12     
24     Mar     BB         YY         34     
13     Feb     CC         ZZ         7

乙:

Day    Month   value2
03     Jan     16
24     Mar     2

我试图在日和月加入它们,但是如果没有行匹配,我希望它创建一个包含所有组合的行。

我想要一张如下表:

C:

Day    Month   Random1    Random2    value    Type
01     Jan     AA         XX         12       value1
24     Mar     BB         YY         34       value1
13     Feb     CC         ZZ         7        value1
03     Jan     AA         XX         16       value2
03     Jan     AA         YY         16       value2
03     Jan     AA         ZZ         16       value2
03     Jan     BB         XX         16       value2
03     Jan     BB         YY         16       value2
03     Jan     BB         ZZ         16       value2
03     Jan     CC         XX         16       value2
03     Jan     CC         YY         16       value2
03     Jan     CC         ZZ         16       value2
24     Mar     AA         XX         2        value2
24     Mar     AA         YY         2        value2
24     Mar     AA         ZZ         2        value2
24     Mar     BB         XX         2        value2
24     Mar     BB         YY         2        value2
24     Mar     BB         ZZ         2        value2
24     Mar     CC         XX         2        value2
24     Mar     CC         YY         2        value2
24     Mar     CC         ZZ         2        value2

我的 sql 查询异常复杂,我确信有一种简单的方法可以做到这一点。 (我实际上是使用sqldf() 在 R 中编写此查询,我正在寻找 sql 建议,但我愿意接受替代方案。)

【问题讨论】:

  • 您在寻找 sql 解决方案还是 R?
  • 如果您尝试在 sql 中执行此操作,请查看游标和记录。我认为这可以帮助你。
  • @akrun,我正在寻找一个 sql 解决方案,因为我希望它高效,但我对 R 解决方案持开放态度。

标签: mysql sql r sqldf


【解决方案1】:

结果集似乎包括集 A,以及由 Random1 的唯一值、Random2 的唯一值和集 B 组合而成的集。

我会用这个

SELECT Day, Month, Random1, Random2, value1, 'value1' AS type
FROM tableA
UNION
SELECT tableB.Day, tableB.Month, r1.Random1, r1.Random2, tableB.value2, 'value2'
FROM tableB
JOIN (SELECT DISTINCT Random1
      FROM tableA) AS r1
JOIN (SELECT DISTINCT Random2
      FROM tableA) AS r2;

【讨论】:

  • 我不得不将列名从 'value1' 更改为 'value' 但这有效。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-01-08
  • 2013-08-07
  • 2010-12-26
  • 1970-01-01
  • 2022-12-16
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
相关资源
最近更新 更多