【问题标题】:select unique combination in two overlap datasets在两个重叠数据集中选择唯一组合
【发布时间】:2015-05-13 13:25:07
【问题描述】:

例如,在 SAS 中,我在数据集 A(左下方)中有 5 个 ID。有一个数据集 B,(可能包含一些 A 的 ID,右下方)。我需要在 A 和 B 上找到一个独特的组合(A 是主要结果数据集),性别相同,年龄范围在 5 以内,收入范围在 10000.Tt 内可能有很多 b.id 可以与 a.id 合并。但关键是,我只能使用一次 b.id。在这种情况下,101 与 106 合并,102 与 111,103 合并与 112,105 与 110 合并。抱歉,我很难描述我的问题。希望它足够清楚。谢谢!

ID  sex  age   income                 ID    sex    age   income
101  F    30    20000                 106    F      26    21000
102  M    20    10000                 102    M      20    10000
103  F    38    30000                 110    M      45    44000
104  M    55    35000                 111    M      19    14000
105  M    43    45000                 112    F      33    34000

结果

    ID_a  sex_a  age_a   income_a    ID_b    sex_b    age_b   income_b
      101  F    30    20000                 106    F      26    21000
      102  M    20    10000                 111    M      19    14000
      103  F    38    30000                 112    F      33    34000
      104  M    55    35000                 
      105  M    43    45000                 110    M      45    44000

【问题讨论】:

  • 您能告诉我们您尝试了哪些查询,以便我们帮助指出您的方法存在的问题吗?
  • 不,我不明白。什么链接 101 到 106?你根据什么规则来配对记录?
  • 在实际情况下,我在 A 中有 100 个唯一 ID,在 B 中有 300 个唯一 ID,可能有很多 b.id 可以与 a.id 合并。但关键是,我只能使用一次 b.id。我认为这不是我可以做的一个左连接......也许在 SQL 中我们有一些函数可以解决这个难题?
  • 您好,Thorsten Kettner。我添加一个结果....
  • 好吧,我还是不明白。我仍然不知道为什么您将 101 与 106 结合起来,而不是与 112 结合。合并两条记录的规则是什么? (顺便说一句:使用@Thorsten Kettner 来回复。否则我不会收到任何通知并且可能不会回来。)

标签: sql join sas combinations datastep


【解决方案1】:
select a.Id, b.Id from SetA a
left join SetB b on a.sex = b.sex and 
a.age between b.age - 5 and b.age + 5 and 
a.income between b.income - 10000 and b.income + 10000

【讨论】:

  • 嗨瑞奇。感谢您的代码。我应该如何处理多个 b.id 与 a.id 合并?并且相同的 b.id 可能与不同的 a.id 合并?我确实想要一个独特的组合..
  • 您的意思是它们可能包含相同的 ID。那我建议你在最后加上:和a.id b.id
  • 嗯。这是其中一件事。也许我应该这样解释:B就像一个水池。每次在 B 中有 a.id 匹配时,我都会从 B 中拉出那个 id 并且不能放回去。非常感谢。我只是很难把它整理出来:(
  • 您的意思是池 a.Id 可以与 b.Id 有很多匹配项。但是 b.Id 与 a.Id 可能只有一个匹配项?在这种情况下,什么定义了 b.Id 的最佳匹配?
【解决方案2】:

您应该能够使用this question 的答案中使用的技术进行模糊匹配,同时确保每个 b.id 只使用一次。

这个想法是将您的 B 数据集加载到一个临时数组/哈希对象中,这样您就可以在将其匹配到 A 时跟踪哪些 b.ids 已被使用。

【讨论】:

    【解决方案3】:
    SELECT 
        A.ID, 
        B.ID
    FROM lefttable A
    INNER JOIN righttable B
    ON (A.sex = B.sex) AND (A.age BETWEEN B.age -5 AND B.age + 5) AND (A.income BETWEEN B.income -10000 AND B.age + 10000)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 2019-09-09
      • 2016-07-08
      • 1970-01-01
      • 2011-04-13
      • 2012-08-20
      相关资源
      最近更新 更多