本示例基于SQL Server数据库,通过 窗口函数(window function),对数据进行多字段排序,并获取排序后的第1条数据,以实现查询 “物料在最新采购日期的最小采购价格” 的目的。
SQL取值逻辑:
1、如果同一物料存在多条采购记录,取采购日期最大的;
2、如果同一采购日期存在多条记录,取采购价格最低的。
目标数据与查询结果:
Step1: 创建临时表,并插入测试数据
if Object_id('Tempdb..#temp1') is not null drop table #temp1
create table #temp1(ItemNumber varchar(10),PurchDate date,PurchPrice decimal(10,2))
insert into #temp1(ItemNumber,PurchDate,PurchPrice)
select 'Item01', '2016-1-8',3.33 union all
select 'Item01', '2016-5-8',2.22 union all
select 'Item01', '2016-3-8',1.11 union all
select 'Item02', '2016-3-9',4.44 union all
select 'Item02', '2016-5-9',5.55 union all
select 'Item02', '2016-1-9',6.66 union all
select 'Item03', '2016-1-7',9.99 union all
select 'Item03', '2016-3-7',8.88 union all
select 'Item03', '2016-3-7',7.77
Step2: 查询所有测试数据
select * from #temp1 order by ItemNumber asc,PurchDate desc,PurchPrice asc
Step3: 通过窗口函数row_number() over partition by,对数据排序后取第1条
select *
from (
select ItemNumber,PurchDate,PurchPrice,
row_number() over(partition by ItemNumber order by ItemNumber asc,PurchDate desc,PurchPrice asc) row_num
from #temp1) t1
where t1.row_num=1
注:通过调整 order by 也可实现其他需求,例如取最早日期或最高采购价格的记录。
转自我早年间的个人博客:MIS NOTE
网友评论