2016-03-23 5 views
0

У меня есть структуру таблицы в следующим образом:Oracle Distinct на одной колонке

ITEM LOC STATUS QTY 
001 RS1 A  10 
001 JS1 I  20 
110 RS1 A  4 

Я хочу, чтобы получить результаты на основе отдельного пункта только, независимо от того, что значения идут с этой

Так результат должен быть

ITEM LOC STATUS QTY 
001 JS1  A  10 
110 RS1  A  4 

Как это сделать?

+0

группы по пункту и использовать max или min для других столбцов –

+0

Как выбрать значения LOC, STATUS и QTY? Все из той же строки (которая) или другой стратегии? – jarlh

ответ

0

Один метод агрегации, если значения не нужно из того же ряда:

select item, max(loc) as loc, . . . 
from t 
group by item; 

Если вы хотите, чтобы все значения из одной строки, используйте row_number():

select t.* 
from (select t.*, row_number() over (partition by item order by item) as seqnum 
     from t 
    ) t 
where seqnum = 1; 
0

Если вы хотите получить минимальное значение за item за каждый столбец (это то, что показывают ожидаемые результаты), то:

SELECT ITEM, 
     MIN(LOC) AS LOC, 
     MIN(status) AS status, 
     MIN(qty) AS qty 
FROM table_name 
GROUP BY item 

Если вы хотите получить значение для элемента, которые являются минимумом на определенный порядок, то:

SELECT ITEM, 
     MIN(LOC) KEEP (DENSE_RANK FIRST ORDER BY your_criteria) AS LOC, 
     MIN(status) KEEP (DENSE_RANK FIRST ORDER BY your_criteria) AS status, 
     MIN(qty) KEEP (DENSE_RANK FIRST ORDER BY your_criteria) AS qty 
FROM table_name 
GROUP BY item 

Или, если вы хотите, чтобы быть все из тех же строк, то:

SELECT item, loc, status, qty 
FROM (
    SELECT t.*, 
     ROW_NUMBER() OVER (PARTITION BY item ORDER BY your_criteria) AS RN 
    FROM table_name t 
) 
WHERE RN = 1; 
Смежные вопросы