如何取值:‘类型、品号’两个字段相同,且‘日期、单号’两个字段最大的记录行

yanele 2020-08-04 04:49:25
现有数据表主要列:

日期 单号 类型 品号 单价
2020-08-03 A001 外购 10010102 10
2020-08-03 A002 自制 10010103 11
2020-08-03 A003 自制 10010104 12
2020-08-03 A004 外购 10010105 13

2020-08-04 A001 外购 10010101 14
2020-08-04 A002 外购 10010101 15
2020-08-04 A003 自制 10010104 16
2020-08-04 A004 外购 10010105 17

如何根据‘类型、品号’两个字段相同,且‘日期、单号’两个字段最大的记录行(如下):
日期 单号 类型 品号 单价
2020-08-03 A001 外购 10010102 10
2020-08-03 A002 自制 10010103 11

2020-08-04 A002 外购 10010101 15
2020-08-04 A003 自制 10010104 16
2020-08-04 A004 外购 10010105 17

求助大神:能快速得到这样的信息吗?
...全文
123 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 版主 2020-08-04
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('dbo.[t]') IS NOT NULL 
	DROP TABLE dbo.[t]
GO
CREATE TABLE dbo.[t](
[日期] DATETIME
,[单号] VARCHAR(10)
,[类型] NVARCHAR(10)
,[品号] NVARCHAR(10)
,[单价] INT
)
GO
SET NOCOUNT ON
INSERT INTO dbo.[t] VALUES(N'2020-08-03',N'A001',N'外购',N'10010102',N'10')
INSERT INTO dbo.[t] VALUES(N'2020-08-03',N'A002',N'自制',N'10010103',N'11')
INSERT INTO dbo.[t] VALUES(N'2020-08-03',N'A003',N'自制',N'10010104',N'12')
INSERT INTO dbo.[t] VALUES(N'2020-08-03',N'A004',N'外购',N'10010105',N'13')
INSERT INTO dbo.[t] VALUES(N'2020-08-04',N'A001',N'外购',N'10010101',N'14')
INSERT INTO dbo.[t] VALUES(N'2020-08-04',N'A002',N'外购',N'10010101',N'15')
INSERT INTO dbo.[t] VALUES(N'2020-08-04',N'A003',N'自制',N'10010104',N'16')
INSERT INTO dbo.[t] VALUES(N'2020-08-04',N'A004',N'外购',N'10010105',N'17')
---------- 以上为测试表及测试数据 -------------

SELECT * 
FROM (
	SELECT ROW_NUMBER() OVER (PARTITION BY 类型,品号 ORDER BY 日期 DESC,单号 DESC) AS rid,* 
	FROM dbo.t
) AS tt
WHERE tt.rid=1
ORDER BY 日期,单号
RINK_1 2020-08-04
  • 打赏
  • 举报
回复
SELECT * FROM (SELECT *,ROW_NUMBER() OVER (PARTITION BY 类型,品号 ORDER BY 日期 DESC,单号 DESC) AS SEQ FROM TABLE) AS A WHERE SEQ=1
yanele 2020-08-04
  • 打赏
  • 举报
回复
貌似这样可以,但不确认是否最优:
select a.*
from #t a
inner join (select 类型,品号,max(日期) 日期,max(单号) 单号 from #t group by 类型,品号) b on a.类型=b.类型 and a.品号=b.品号 and a.日期=b.日期 and a.单号=b.单号
yanele 2020-08-04
  • 打赏
  • 举报
回复
貌似这样可以,不知道是否最优:

select a.*
from #t a
inner join (select max(日期) 日期,max(单号) 单号 from #t group by 类型,品号) b on a.日期=b.日期 and a.单号=b.单号

34,838

社区成员

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

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