SQL去重复

 背景:每个站在每天有可能会产生多条日结数据,但是我们只取最新的一条数据 

  采取方式: ROW_NUMBER+ partition by

 说明:  StationId:站ID  DAY_BATCH_DATE 日结时间    Grade_Id 商品号  tank_id 位置  SHIFT_CONTROL_ID 日结ID (ID越大说明是当天最新的)

   SQL:

with tank as(
 select Shift_Control_Id aa,t.*, OM.DensityValue 
        , ROW_NUMBER() over(partition by t.[StationId],[DAY_BATCH_DATE],[Grade_Id],[tank_id] order by [SHIFT_CONTROL_ID] desc) as row_sort
    from [dbo].BC_FUEL_TANK_DELIVERY t(NOLOCK) 
     LEFT JOIN PT_OILMONTHDENSITY OM(NOLOCK) ON OM.MONTH=CONVERT(VARCHAR(7),t.Day_Batch_Date,120)  and OM.OilCode=t.Grade_Id  --密度
    where t.Day_Batch_Date between 2021-06-01 and 2021-06-21 
    )
    select  SUM(ss.DELIVERY_VOLUME) DELIVERY_VOLUME 
            ,SUM(ss.DELIVERY_VOLUME*ss.DensityValue) DELIVERY_VOLUME_Weight 
            ,ss.StationId,ss.Grade_Id,ss.tank_id  into #DATA2 from tank ss    where row_sort = 1
            group by ss.StationId,ss.Grade_Id ,ss.tank_id ; 

解读: 我们把每个站,每一天,每一钟商品,每一个位置 进行分区,然后按照日结ID进行排序  产生row_sort编号 ,(这样操作的结果就是如果有一天同时同一个地方同一种商品出现多次日结的话row_sort就会从1开始增加)我们只需要row_sort=1的数据插入到#data2临时表

 

参考:

sql去重,同一个字段出现多条取一条的sql语句

1.某字段重复,其他字段值不同时,按重复字段分组只取一条的sql语句

select b.* from
(SELECT a.*,row_number() over (partition by a.column )as group_idx
FROM table_name a )b
where b.group_idx = 1

 

2、某字段重复,其他字段值不同时,按重复字段分组只取一条的sql语句,数据又根据某字段排序

select b.* from
(SELECT a.*,row_number() over (partition by a.column1 order by a.column2 desc)as group_idx
FROM table_name a )b
where b.group_idx = 1

 

SQL去重复

上一篇:mysql 设置当前时间


下一篇:JDBC获取数据库连接-两种方法