背景:每个站在每天有可能会产生多条日结数据,但是我们只取最新的一条数据
采取方式: 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临时表
参考:
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‘