2016-09-21 5 views
5
私は、従来のSQLスタイルを実行したい

は、我々は左 テーブル内の行ごとに結果に少なくとも1つの行を取得KDB +/Q.kdbで効率的な左結合を実行するにはどうすればよいですか?

  • に参加残しました。
  • 複数の一致が右の表に存在する場合、私は それらのそれぞれの行を取得するだけでなく、最初のマッチのための

テストデータ

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 

誰もが速くおよび/またはより良い何らかの 他の方法であるものと私を供給することができますか?私は実際には、例えば、別名の使用を避けたいと思います。 http://www.timestored.com/kdb-guides/qsql-inner-left-joins

我々はすべてのrow..based @Connorsソリューションの

ニースソリューションコナーをしたいので:

答えて

0

@ 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 
+0

うわー、ありがとう! Connor、まだkを読んでいません。 **あなたがしたことを説明できますか?** もう一度ありがとう! – JSLover

+0

これはq実装です。 'q)nungroup:{$ [count x:0!//[x]; x]} ' –

+0

@Connor Gervin:あなたの解決策は、例えば次のように間違った結果をもたらします。 'x:([] a:1 1 2 3 4; b:3 4 5 6 100)' –

1
q)`a xgroup y // group the lookup table by keys 
a| c 
-| --- 
1| ,7 
2| 8 9 
4| ,10 
q)x lj `a xgroup y // join all combinations 
a b c 
------------ 
1 3 ,7 
1 4 ,7 
2 5 8 9 
3 6 `long$() 
q)ungroup x lj `a xgroup y // unroll using ungroup to produce a flat table 
a b c 
----- 
1 3 7 
1 4 7 
2 5 8 
2 5 9 

私たちは、KDBの無料チュートリアルを提供は、それはここではそれらのすべてを示して結合します。 FYI

q)bungroup:{ungroup {$[0=count x;(),first x; x]}''[x]} 
q)bungroup x lj `a xgroup y 
a b c 
-------- 
1 3 7 
1 4 7 
2 5 8 
2 5 9 
3 6 
4 100 10 

:コナーズは迅速であり、この特定のケースのために、より少ないメモリを使用しています、私はあなたが/短縮コードを単純化するように変更しました。

+0

最初の要件を満たしていますか(左テーブルの各行について結果に少なくとも1つの行があります)。私はOPが '3 6 0N'を結果に含めることを望んでいると思う。 –

+2

助けてくれてありがとう! 右の表の各行について、結果に少なくとも1つの行が必要です。 kdb "lj"操作が使用されている場合でも、ungroup/xgroupトリックは常に内部結合になります。これは、グループ化された表の左結合によって生成されたNULL行に、不一致表の列の長さがゼロのリストが含まれているためです。これらがグループ解除されると、ヌルエントリを含む単一の行ではなく、ゼロの行が生成されます。 リストの値が列の長さがゼロのときにヌルエンティティを持つ単一の行を生成するungroupのバージョンを使用することは意味がありますか? Tx! – JSLover

+0

今、私は本当に悪い形であると私が思っていることを自分自身が見つけます。私は文字列の使用を避けています。ストリングは、私が使っているように、ここで提案されているアプローチを破るので、私はそれをやっています。たとえば、ソリューションが失敗した文字列でxの新しい値を指定してソリューションを再実行します。 x :([]; a:1 1 2 3; b:3 4 5 6; z:( "foo"; "bar"; "baz"; "bang")) – JSLover

関連する問題