sql 查询相同记录下日期最大的一条加日期过滤

麻哩麻饭的 2023-03-02 15:37:54

博客有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

思索了半天,未有好的思路,望大神指点....

...全文
88 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 版主 2023-03-06
  • 打赏
  • 举报
回复

img


SQLserver和mysql写法类似

二月十六 版主 2023-03-06
  • 打赏
  • 举报
回复

--测试数据
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'

)

幸福感奇差 2023-03-02
  • 打赏
  • 举报
回复

内层查询用窗口函数排序,外层筛选排序为 1 的

select *
from 
(select *, row_number() over(partition by 日期, 编号, 仓库 order by 数量 desc) rowid
from tb) t
where rowid = 1

34,566

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧