2013-03-06 4 views
0

Я использую Oracle 11G, и у меня есть таблица со следующими столбцами и значениями, и я хочу выбрать значение для каждого столбца на основе столбца приоритета. Я хочу только одну строку для каждого ID.Как выбрать строку на основе значения приоритета в другой строке?

ID NAME NAME_PRIORITY COLOR COLOR_PRIORITY 
1  SAM  2    RED   1 
1  SAM  2    GREEN  2 
1  JOHN  1    BLUE   3 
2  MARY  2    ORANGE  1 
3  JON  2    RED   2 
3  PETE  3    GREEN  1 

Желательные Результаты

ID NAME NAME_PRIORITY COLOR  COLOR_PRIORITY 
1 JOHN  1    RED   1 
2 MARY  2    ORANGE  1 
3 JON  2    GREEN   1 

Как я выбираю название и цвет с самым низким приоритетом # и только одну строку для каждого идентификатора.

ответ

2

о ne:

select d.id, min(name) keep (dense_rank first order by name_priority) name, 
     min(name_priority) name_priority, 
     min(color) keep (dense_rank first order by color_priority) color, 
     min(color_priority) color_priority 
    from yourtab d 
group by id; 
+0

+1 Это пятно, я не знал о 'keep'. Вот демонстрация - http://www.sqlfiddle.com/#!4/ab996/5 – Taryn

+0

Спасибо, что я никогда не знал об этом! Я собирался попробовать что-то более сложное, как ответы ниже. Это намного проще, спасибо! – swingard

0

Вы можете использовать row_number() как от name_priority и color_priority, чтобы получить результат:

select n.id, 
    name, 
    name_priority, 
    color, 
    color_priority 
from 
(
    select id, 
    name, 
    name_priority, 
    row_number() over(partition by id order by name_priority) name_row 
    from yourtable 
) n 
inner join 
(
    select id, 
    color, 
    color_priority, 
    row_number() over(partition by id order by color_priority) color_row 
    from yourtable 
) c 
    on n.id = c.id 
    and n.name_row = c.color_row 
where n.name_row = 1 
    and c.color_row = 1 

См SQL Fiddle with Demo.

После того как вы row_number() для каждого приоритета, то вы присоединитесь результаты на id и номер строки и возвращает только строки, где номер строки равен 1.

0

Этот запрос использует Common Table Expression и ROW_NUMBER()

WITH nameList 
AS 
(
    SELECT ID, Name, 
      ROW_NUMBER() OVER (PARTITION BY ID 
          ORDER BY NAME_PRIORITY) rn 
    FROM TableName 
), 
colorList 
AS 
(
    SELECT a.ID, a.Name, 
      b.Color, b.COLOR_PRIORITY, 
      ROW_NUMBER() OVER (PARTITION BY a.ID 
          ORDER BY COLOR_PRIORITY) rnB 
    FROM nameList a 
      INNER JOIN tableName b 
       ON a.ID = b.ID AND a.rn = 1 
) 
SELECT ID, Name, Color, COLOR_PRIORITY 
FROM colorList 
WHERE rnB = 1 
Смежные вопросы