join - 如何在 kdb 中执行有效的左连接?

标签 join left-join kdb q-lang

我想在 KDB+/Q 中运行一个传统的 SQL 风格的左连接。

  • 对于左侧的每一行,我们在结果中至少得到一行
    table 。
  • 如果右表中有多个匹配项,我会得到一行
    每一个,不仅仅是第一场比赛

  • 测试数据
      x:([];a:1 1 2 3; b:3 4 5 6)
    
      y:([]; a:1 2 2 4; c:7 8 9 10)
    

    我能想到的最好的版本是这样的:

    这将仅提供第一个匹配项的左连接附加到提供所有匹配项的内部连接,然后删除重复项:
      distinct ej[`a; x; y] , x lj `a xkey y
    

    谁能给我提供一个在某些方面更快和/或更好的
    另一种方式?例如,我真的很想避免使用 distinct 。

    最佳答案

    基于@Ryan 的回答。

    k)nungroup:{$[#x:0!x;(,/){$[#t:+:x;t;enlist *:'[x];t]}'[x]]}  
    q)nungroup:{$[count x:0!x;(,/){$[count t:flip x;t;enlist first'[x]]}'[x];x]}  
    
    q)nungroup x lj ` \`a xgroup y
    
    a b c 
    ----- 
    1 3 7 
    1 4 7 
    2 5 8 
    2 5 9 
    3 6
    

    关于join - 如何在 kdb 中执行有效的左连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39626795/

    相关文章:

    KDB 计算列的唯一组合

    mysql - 复杂的 MySQL 五表连接

    mysql - oracle查询mysql左连接

    MYSQL 慢 ORDER BY

    php&mysql 查找父类别名称

    kdb - 如何在 KDB+ 中按时间排序结果

    date - 在 KDB Q 中将日、月、年创建为整数的日期

    mysql - 如何从 mySQL 中的 group-by 选择的行中选择一个字段

    mysql - 可以通过一个查询引用两个特定的表

    mysql - 如何编写日期值适合一个范围内和另一个范围外的连接查询