Oracle SQL как убрать дублированную строку по заданному столбцу c - PullRequest
0 голосов
/ 02 апреля 2020

например, у меня есть значения, подобные приведенным ниже, в одной таблице

 Table A                          
 ----------------                 
 item_name price departure        
 ----------------                 
 shoe      10    150
 shoe      10    150              
 socks     2     100              
 socks     2     110
 shirt     5     170
 shirt     5     170            
 gloves    1     210  
 gloves    1     210
 gloves    1     210    

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

select item_name, price, departure from table A
UNION 
select item_name, price, departure from table A

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

 Table A                          
 ----------------                 
 item_name price departure        
 ----------------                 
 shoe      10    150             
 socks     2     100              
 socks     2     110
 shirt     5     170          
 gloves    1     210  

Можете ли вы помочь мне, я ищу простой метод что-то без левого соединения, потому что таблица A содержит много данных, и я хочу оптимизировать

я хочу получить результат, как показано ниже, где носки имеют наименьший отдел в одном и том же (item_name и price)

Table A                          
 ----------------                 
 item_name price departure        
 ----------------                 
 shoe      10    150             
 socks     2     100              
 shirt     5     170          
 gloves    1     210  

спасибо за помощь

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Я думаю, что вам просто нужно агрегирование:

select item_name, price, min(departure) departure
from mytable
group by item_name, price

Демонстрация на DB Fiddle :

ITEM_NAME | PRICE | DEPARTURE
:-------- | ----: | --------:
shoe      |    10 |       150
socks     |     2 |       100
shirt     |     5 |       170
gloves    |     1 |       210
0 голосов
/ 02 апреля 2020

Использование row_number() - эффективный способ выбора конкретной строки в таблице. В предложении over() используйте partition by и order by, чтобы контролировать, когда номер строки сбрасывается в 1:

select
    *
from (
    select
         item_name
       , price
       , departure
       , row_number() over(partition by  item_name order by price, departure) as rn
    from mytable a  
    ) d
where rn = 1
ITEM_NAME | PRICE | DEPARTURE | RN
:-------- | ----: | --------: | -:
gloves    |     1 |       210 |  1
shirt     |     5 |       170 |  1
shoe      |    10 |       150 |  1
socks     |     2 |       100 |  1

db <> fiddle здесь

...