मेरे पास एक नीचे की टेबल थी

वाई टेबल

id     val
--     ---
1       A 
1       B 
1       C 
2       B
2       C
3       A

नीचे की तरह आउटपुट चाहिए

 sno   val1    va2       val3
-----  ----   -----     ------
  1      A     B          C   
  2      B     C          -
  3      A     -          -

मैंने सेल्फ जॉइन के साथ क्वेरी लिखी है जैसे

SELECT t1.id as sno, t1.val as val1, t2.val as va2, t3.val as val3
  FROM y t1 JOIN y t2 ON t1.id = t2.id
  JOIN y t3 ON t2.id = t3.id
  ORDER BY 1,2,3,4;

लेकिन मैं कार्टेशियन जॉइन की तरह लौटता हूं। उचित परिणाम कैसे प्राप्त करें।

0
Nvr 1 पद 2019, 20:10

3 जवाब

सबसे बढ़िया उत्तर

आप row_number() और सशर्त एकत्रीकरण का उपयोग कर सकते हैं:

select id,
       max(case when seqnum = 1 then val end) as val_1,
       max(case when seqnum = 2 then val end) as val_2,
       max(case when seqnum = 3 then val end) as val_3
from (select t.*
             row_number() over (partition by id order by val) as seqnum
      from t
     ) t
group by id;
2
Gordon Linoff 1 पद 2019, 20:13

यदि आप वास्तव में स्वयं शामिल होने का उपयोग करके इसे प्राप्त करना चाहते हैं तो आपको निम्नलिखित के रूप में group by और self join का उपयोग करने की आवश्यकता है:

SELECT t1.id as sno, min(t1.val) as val1, min(t2.val) as va2, min(t3.val) as val3
  FROM y t1 
  LEFT JOIN y t2 ON t1.id = t2.id AND t1.val < t2.val
  LEFT JOIN y t3 ON t2.id = t3.id And t2.val < t3.val
  Group by t1.id

चीयर्स !!

1
Popeye 1 पद 2019, 20:53

आपके Oracle संस्करण के आधार पर, आप इसे विभिन्न तरीकों से हल कर सकते हैं। आप अपने सेल्फ-जॉइन को ठीक कर सकते हैं (आपको बाएं बाहरी जॉइन की जरूरत है, न कि आपके जैसे इनर जॉइन की - इनर जॉइन के साथ आपको केवल वह आईडी मिलेगी जिसमें इनपुट टेबल में तीनों मान हैं, बाकी कोड को ठीक करने के बाद भी) . आप सशर्त एकत्रीकरण का उपयोग कर सकते हैं, जैसा कि गॉर्डन लिनॉफ़ ने दिखाया है; ओरेकल में संस्करण 10.2 तक पिवोटिंग (आप जिस ऑपरेशन के बारे में पूछ रहे हैं उसका नाम) इस प्रकार किया जाता है। संस्करण 11.1 के बाद से आप pivot ऑपरेटर के साथ भी ऐसा ही कर सकते हैं।

Oracle 12.1 के बाद से, आप match_recognize क्लॉज के साथ भी ऐसा ही कर सकते हैं। यहां कैसे:

create table y (id, val) as 
  select 1, 'A'  from dual union all
  select 1, 'B'  from dual union all 
  select 1, 'C'  from dual union all
  select 2, 'B'  from dual union all
  select 2, 'C'  from dual union all
  select 3, 'A'  from dual
;

select id, val1, val2, val3
from   y
match_recognize(
  partition by id
  order     by val
  measures  r1.val as val1, r2.val as val2, r3.val as val3
  pattern   (^ r1 r2? r3?)
  define    r1 as null is null
);

  ID VAL1 VAL2 VAL3
---- ---- ---- ----
   1 A    B    C
   2 B    C
   3 A
1
mathguy 1 पद 2019, 20:47