SQL / Oracle: Как найти ключ вхождения 'N' для КАЖДОГО значения? - PullRequest
0 голосов
/ 23 февраля 2012

Допустим, таблица выглядит так (только для иллюстрации):

KEY  VALUE
  1      A
  2      A    
  3      B
  4      C
  5      A
  6      B
  7      C
  8      A
  9      C

Мне нужен ОДИН SQL , чтобы получить ключ 3-го (или менее) вхождения для КАЖДОГО значения?

VALUE  KEY 
    A    5    (more than 3 occurrences, so it gets the 3th occurrence)  
    B    6    (only 2 occurrences, so it gets the last one)
    C    9 

Обновление: Oracle 10g

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Я подозреваю, что есть более простой способ написать это без 3-х уровней вложенности. Но это должно сработать.

SQL> ed
Wrote file afiedt.buf

  1  with x as (
  2    select 1 key, 'A' val from dual union all
  3    select 2, 'A' from dual union all
  4    select 3, 'B' from dual union all
  5    select 4, 'C' from dual union all
  6    select 5, 'A' from dual union all
  7    select 6, 'B' from dual union all
  8    select 7, 'C' from dual union all
  9    select 8, 'A' from dual union all
 10    select 9, 'C' from dual)
 11  select key,
 12         val
 13    from (select key,
 14                 val,
 15                 rnk,
 16                 max(rnk) over (partition by val) max_rnk
 17            from (select key,
 18                         val,
 19                         rank() over (partition by val order by key) rnk
 20                    from x
 21                 )
 22           where rnk <= 3
 23         )
 24*  where rnk = max_rnk
SQL> /

       KEY V
---------- -
         5 A
         6 B
         9 C
0 голосов
/ 23 февраля 2012
SELECT t1.Value, t1."KEY"
FROM (SELECT ROW_NUMBER() OVER (PARTITION BY Value ORDER BY "KEY") AS RowNumber, 
             "KEY", Value
      FROM MyTable) t1
     LEFT JOIN 
     (SELECT ROW_NUMBER() OVER (PARTITION BY Value ORDER BY "KEY") AS RowNumber,
             "KEY", Value
      FROM MyTable) t2 ON t2.Value = t1.Value AND t2.RowNumber = t1.RowNumber + 1
WHERE t1.RowNumber = 3 OR (t1.RowNumber IN (1, 2) AND t2."Key" IS NULL)
...