【问题标题】:Oracle SQL how to eliminate duplicated row by specific columnOracle SQL如何消除特定列的重复行
【发布时间】:2020-07-13 20:09:15
【问题描述】:

例如,我在一张表中有如下值

 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 包含大量数据,我想优化

我想得到如下结果,其中袜子的部门最小(商品名称和价格)

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

感谢帮助

【问题讨论】:

  • 你试过select distinct吗?
  • distinct 现在适用于具有不同出发点的所有列,结果将相同
  • group by 和聚合函数? (array_aggminmax 等)

标签: sql oracle group-by greatest-n-per-group


【解决方案1】:

我认为你只需要聚合:

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

Demo on DB Fiddle

项目名称 |价格 |离开 :-------- | ----: | --------: 鞋| 10 | 150 袜子 | 2 | 100 衬衫 | 5 | 170 手套| 1 | 210

【讨论】:

  • 这仅适用于这种情况,因为如果您有很多数据,那么所有重复行的最小部门总是相同的
  • @worker555 。 . .我将您的评论解释为:“这适用于我提出的问题”。我认为这是最简单的解决方案(你应该接受它)。如果您有不同的问题,则应将其作为问题提出。
【解决方案2】:

使用row_number() 是从表中选择特定行的有效方法。在over() 子句中使用partition byorder 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
项目名称 |价格 |出发 |注册护士 :-------- | ----: | --------: | -: 手套| 1 | 210 | 1 衬衫 | 5 | 170 | 1 鞋| 10 | 150 | 1 袜子 | 2 | 100 | 1

db小提琴here

【讨论】:

    猜你喜欢
    • 2020-12-21
    • 2019-10-10
    • 2021-06-04
    • 2014-01-22
    • 2016-06-25
    • 2018-02-15
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多