2017-10-12 7 views
0

内の変数のキーに基づいて類似データのグループの組み合わせのリストを生成するために、どのように見えるような: -は、私はレシピデータを持っているOracleのPL/SQL

ZONE AREA LOC DEPT FGOOD INGTYP INGRED 
    4 EC 1213 62 5476 I 105 
    4 EC 1213 62 5476 I 2834 
    4 EC 1213 62 5476 I 16196 
    4 EC 1213 62 5476 I 190226 
    4 EC 1213 62 5476 I 207075 
    4 EC 1213 62 5476 I 333554 
    4 EC 1261 62 5476 I 2834 
    4 EC 1261 62 5476 I 16196 
    4 EC 1261 62 5476 I 190226 
    4 EC 1261 62 5476 I 207075 
    4 EC 1261 62 5476 I 333554 
    4 EC 1265 62 5476 I 2834 
    4 EC 1265 62 5476 I 16196 
    4 EC 1265 62 5476 I 190226 
    4 EC 1265 62 5476 I 207075 
    4 EC 1265 62 5476 I 333554 

およそ2,400,000レコードの場合。私は

区別は一つの成分105、および他を含む良好な組み合わせを完成することを含んでいないので、2件のユニークなレシピがグループ間で必要とされることである
ZONE AREA FGOOD INGTYP INGRED  VERSION  
    4 EC  5476 I  105   1 
    4 EC  5476 I  2834   1 
    4 EC  5476 I  16196  1 
    4 EC  5476 I  190226  1 
    4 EC  5476 I  207075  1 
    4 EC  5476 I  333554  1 

    4 EC  5476 I  2834   2 
    4 EC  5476 I  16196  2 
    4 EC  5476 I  190226  2 
    4 EC  5476 I  207075  2 
    4 EC  5476 I  333554  2 

としてZONE &領域にわたって一意の組み合わせを示すために必要 ソースデータから3つのレシピのうちの1つを選択します。

Oracleでこれらの結果を得るために必要なCTE、サブクエリなどの組み合わせに苦しんでいます。

ありがとうございます!

+0

不明。 「完成した1つの良い組み合わせには成分105が含まれ、もう1つには含まれていないので、ソースデータから3つのレシピのグループの中に2つのユニークなレシピが必要です」という意味を明確にしてください。期待した結果に重複があります。 – GurV

+0

罪の賃金は、永遠のオンザフライ・ノーマライゼーションです。 – APC

+0

GurV、はい、私は様々なレシピの成分のユニークな "グループ"を得ようとしています。 1つの場所でピザにキノコを追加することができますが、他の場所ではピザを追加できません。したがって、明らかに重複した成分がありますが、ユニークなレシピや成分の組み合わせではありません。 – acmoreno

答えて

0

これが役立つことがあります。

select ZONE,AREA,FGOOD,INGTYP,VERSION 
from yourtable 
group by ZONE,AREA,FGOOD,INGTYP,VERSION 
-- where .... -- as needed 
having sum(case when INGRED = 105 then 1 else 0 end) >= 1 

をしかし、あなたの質問の大半は、ちょうどこのアプローチはZONE,AREA,DEPT,FGOOD,INGTYP,INGRED

のパーティション内の最初と最後のセットを見つけるでしょう
+0

WHEREまたはHAVINGは定数ではなく、列と比較する必要があります。私はこのロジックを240万を超える正規化されていないレコードに適用する必要があります。私はすでに成分数を比較することができますが、実際の成分を(キー)番号と説明で比較する必要があります。 – acmoreno

+0

**は**定数ではありません。それはSUM(成分を褒めて表現する事例の)である。そして、「ZONE&AREAの間でユニークな組み合わせを表示する必要がある」というグループ分けが適切であると言えるので、having節を使用する。 –

+0

私は定数( "INGRED = 105")としてINGREDへの参照を伴うCASE文を参照していました。私は本質的に、CTE、一時表またはマテリアライズド・ビューを持つ自己参照JOINを必要とするため、2,400,000レコードをすべて互いに比較することができます。 – acmoreno

0

以上を示唆するのに十分明確ではありません

2ウィンドウ関数row_number()count()を使用していますが、これによりテーブルの通過が最小限に抑えられます。最後のorder by節は美容的です。したがって、オプションです。

SQL Fiddle

CREATE TABLE YOURTABLE 
    (ZONE int, AREA varchar(2), LOC int, DEPT int, FGOOD int, INGTYP varchar(1), INGRED int) 
; 

INSERT INTO YOURTABLE 
    (ZONE, AREA, LOC, DEPT, FGOOD, INGTYP, INGRED) 
VALUES 
    (4, 'EC', 1213, 62, 5476, 'I', 105), 
    (4, 'EC', 1213, 62, 5476, 'I', 2834), 
    (4, 'EC', 1213, 62, 5476, 'I', 16196), 
    (4, 'EC', 1213, 62, 5476, 'I', 190226), 
    (4, 'EC', 1213, 62, 5476, 'I', 207075), 
    (4, 'EC', 1213, 62, 5476, 'I', 333554), 
    (4, 'EC', 1261, 62, 5476, 'I', 2834), 
    (4, 'EC', 1261, 62, 5476, 'I', 16196), 
    (4, 'EC', 1261, 62, 5476, 'I', 190226), 
    (4, 'EC', 1261, 62, 5476, 'I', 207075), 
    (4, 'EC', 1261, 62, 5476, 'I', 333554), 
    (4, 'EC', 1265, 62, 5476, 'I', 2834), 
    (4, 'EC', 1265, 62, 5476, 'I', 16196), 
    (4, 'EC', 1265, 62, 5476, 'I', 190226), 
    (4, 'EC', 1265, 62, 5476, 'I', 207075), 
    (4, 'EC', 1265, 62, 5476, 'I', 333554) 
; 

クエリ1

Results

select 
    * 
from (
     select 
      * 
      , row_number() over(partition by ZONE,AREA,DEPT,FGOOD,INGTYP,INGRED) rn 
      , count(*) over(partition by ZONE,AREA,DEPT,FGOOD,INGTYP,INGRED) cn 
     from yourtable t 
    ) d 
where rn = 1 or rn=cn 
order by 
    ZONE,AREA,DEPT,FGOOD,INGTYP,rn,INGRED 

| zone | area | loc | dept | fgood | ingtyp | ingred | rn | cn | 
|------|------|------|------|-------|--------|--------|----|----| 
| 4 | EC | 1213 | 62 | 5476 |  I | 105 | 1 | 1 | 
| 4 | EC | 1213 | 62 | 5476 |  I | 2834 | 1 | 3 | 
| 4 | EC | 1265 | 62 | 5476 |  I | 16196 | 1 | 3 | 
| 4 | EC | 1261 | 62 | 5476 |  I | 190226 | 1 | 3 | 
| 4 | EC | 1213 | 62 | 5476 |  I | 207075 | 1 | 3 | 
| 4 | EC | 1261 | 62 | 5476 |  I | 333554 | 1 | 3 | 
| 4 | EC | 1261 | 62 | 5476 |  I | 2834 | 3 | 3 | 
| 4 | EC | 1261 | 62 | 5476 |  I | 16196 | 3 | 3 | 
| 4 | EC | 1265 | 62 | 5476 |  I | 190226 | 3 | 3 | 
| 4 | EC | 1261 | 62 | 5476 |  I | 207075 | 3 | 3 | 
| 4 | EC | 1265 | 62 | 5476 |  I | 333554 | 3 | 3 | 
関連する問題