3.4w+
社区成员
博客有sql 查询相同记录下日期最大的一条的方案,具体的数据为:
tab 表以及相关字段:
日期 编号 仓库 数量
2012-05-31 C001 A店 136.00
2012-05-29 C001 A店 139.00
2012-05-28 C001 B店 5.00
2012-05-29 C001 B店 6.00
2012-05-27 C001 C店 11.00
2012-05-29 C001 D店 10.00
2012-05-30 C001 D店 12.00
其语句为:select * from tb t where not exists(select 1 from tb where `编号`=t.`编号` and `仓库`=t.`仓库` and `日期`>t.`日期`)
结果为:
日期 编号 仓库 数量
2012-05-31 C001 A店 136.00
2012-05-29 C001 B店 6.00
2012-05-27 C001 C店 11.00
2012-05-30 C001 D店 12.00
但目前公司需求方案需要增加一个日期查询参数,如查询2012-05-29号的数量,其大概结果为:
日期 编号 仓库 数量
2012-05-29 C001 A店 139.00
2012-05-29 C001 B店 6.00
2012-05-27 C001 C店 11.00
2012-05-29 C001 D店 10.00
思索了半天,未有好的思路,望大神指点....
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([日期] Date,[编号] nvarchar(24),[仓库] nvarchar(22),[数量] decimal(18,2))
Insert #T
select '2012-05-31',N'C001',N'A店',136.00 union all
select '2012-05-29',N'C001',N'A店',139.00 union all
select '2012-05-28',N'C001',N'B店',5.00 union all
select '2012-05-29',N'C001',N'B店',6.00 union all
select '2012-05-27',N'C001',N'C店',11.00 union all
select '2012-05-29',N'C001',N'D店',10.00 union all
select '2012-05-30',N'C001',N'D店',12.00
Go
--测试数据结束
SELECT *
FROM #T t
WHERE t.日期<='2012-05-29'AND NOT EXISTS
(
SELECT 1
FROM #T
WHERE 编号 = t.编号
AND 仓库 = t.仓库
AND 日期 > t.日期
AND 日期<='2012-05-29'
)
内层查询用窗口函数排序,外层筛选排序为 1 的
select *
from
(select *, row_number() over(partition by 日期, 编号, 仓库 order by 数量 desc) rowid
from tb) t
where rowid = 1