求SQL SERVER 按指定条件提取最新记录

大地主刘发财 2018-07-14 11:30:22
现有一套系统,没有源码,也找不到开发商了,现想自己做一个报表,但遇到了个恶心的问题,求教
数据库SQL SERVER 2008 R2
简化的表结构如下
id 客户ID 购买日期 到期时间 商品ID 数量 单价 金额
1 1 2017-1-1 2018-3-1 3 1 2 2
2 1 2018-5-1 2019-6-1 3 1 3 3
3 3 2016-3-15 2017-2-1 8 1 4 4
4 3 2017-3-15 2018-1-1 8 1 5 5
5 3 2018-2-1 2018-6-1 9 1 6 6
6 3 2018-7-1 2018-6-1 9 -1 7 -7
7 4 2015-4-2 2016-12-20 15 1 8 8
8 4 2016-12-21 2017-5-4 15 1 9 9
9 4 2017-5-5 2017-12-31 15 1 10 10
10 4 2018-6-1 2020-1-1 15 1 11 11




需求是查询所有客户最后购买每种商品的单据,按照最后一次购买的时间,包括负数的单据,但不能按ID,因为这套系统当初开发的时候貌似给过一个修改工具,是可以修改订单日期的,目前数据库中的数据很乱
最后期望得到的数据应该是这样的:

id 客户ID 购买日期 到期时间 商品ID 数量 单价 金额
2 1 2018-5-1 2019-6-1 3 1 3 3
4 3 2017-3-15 2018-1-1 8 1 5 5
6 3 2018-7-1 2018-6-1 9 -1 7 -7
10 4 2018-6-1 2020-1-1 15 1 11 11


EXCEL表格下载
https://pan.baidu.com/s/1nL19lS4zMsT96kOMEBHCsQ
...全文
369 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
大地主刘发财 2018-07-22
  • 打赏
  • 举报
回复
引用 3 楼 shinger126 的回复:
;with t as (select *,row_number() over (partition by 客户ID,商品ID order by 购买日期 desc) rn from tba)
select * from t where rn=1

解决了,非常感谢!
shinger126 2018-07-16
  • 打赏
  • 举报
回复
;with t as (select *,row_number() over (partition by 客户ID,商品ID order by 购买日期 desc) rn from tba)
select * from t where rn=1
hyqsweety 2018-07-15
  • 打赏
  • 举报
回复

select *
from a
where id in (
select max(id) as max_id
from a
inner join (
select 客户ID,商品ID,max(购买日期) as max_buy_date
from a
group by 客户ID,商品ID
) b on a.客户ID= b.客户ID and a.商品ID=b.商品ID and a.购买日期=b.max_buy_date
group by 客户ID,商品ID
)
hyqsweety 2018-07-15
  • 打赏
  • 举报
回复
select *
from
where id in (
select max(id) as max_id
from a
inner join (
select 客户ID,商品ID,max(购买日期) as max_buy_date
from a
group by 客户ID,商品ID
) b on a.客户ID= b.客户ID and a.商品ID=b.商品ID and a.购买日期=b.max_buy_date
group by 客户ID,商品ID
)

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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