2017-11-22 1 views
1

私はすべてのカップル(2-uplets)を見つけるアルゴリズムの名前(およびコード:PL/SQLまたはPG/SQL)を探していますセット。セットのすべての2つのアップレットのアルゴリズム名

例: A - B - C 結果: 1:A - B 2:A - C 3:B - C

Iが冪アルゴリズムは、ジョブのこの部分を行うことを知って、私は最適化されたカップルファインダーアルゴリズムを探しています。冪のPG/SQLアルゴリズムの

リンク:https://www.postgresql.org/message-id/20060924054759.GA71934%40winnie.fuhr.org

+1

これは 'tuplets'と呼ばれ、' combination'を探したいのです。 –

+0

@SaniSinghHuttunen "tuplet"は音楽用語です。 OPが参照しているものは['pair'](https://en.wikipedia.org/wiki/Tuple)と呼ばれます。 – Blake

+0

通知がない場合に備えて、私の回答にコメントを追加しました。 – Patrick87

答えて

-1

私はソリューション構築しました:

CREATE OR REPLACE FUNCTION twouplets(a anyarray) 
    RETURNS SETOF anyarray AS 
$BODY$ 
DECLARE 
    retval a%TYPE; 
    size integer := array_upper(a, 1); 
    i  integer; 
    j  integer; 
BEGIN 
    i := 0; 
    j := 1; 

    FOR i IN 1 .. size LOOP 
    FOR j IN 1 .. size-i LOOP 
    retval := '{}'; 
       retval := array_append(retval, a[i]); 
       retval := array_append(retval, a[i+j]); 
       RETURN NEXT retval; 
    END LOOP; 
    END LOOP; 

    RETURN; 

END; 
$BODY$ 
    LANGUAGE plpgsql IMMUTABLE STRICT 
    COST 100 
    ROWS 1000; 
ALTER FUNCTION twouplets(anyarray) 
    OWNER TO postgres; 
1

はあなたが

Select A.x, B.x 
From YourTable as A, YourTable as B 
Where A.key <> B.key 

のようなものを検討しているとあなたはので、これは可能性がありますSQL言及好ましい。クロス積の行数はペア数とほぼ同じであるため、非常に効率的ではありません。

+0

データテーブルにキーがありません。テーブルは次のようなものです:order | (プライマリキーなし、ユニークな値(注文と製品)はありません) –

+0

{A、B} =>ビルディング:{A-B}、{B-A}の場合、この解決策は二重カップルを作成しているため機能しません。あるいは結果が必要なのは、{A-B} –

+0

@QuentinTです。ペアで入れているデータが総順序に入れられるようなもの、つまり>または<を定義することができるのであれば、where句を変更して前述の問題を解決できるかもしれません。最初の要素は厳密に2番目の要素よりも小さいですか?この総注文は「自然な」注文である必要はありません。注文は行いますが、ほとんどの組み込み型は入れられる順序があります。 – Patrick87

関連する問題