取小于当前值的最大值的那条记录. 的sql 怎么写

时间:2021-05-15 15:11:30
表A 
id   col1 col2 .....

给2个参数 s1,s2(其中一个可能为空)


在 col1 小于 s1  或者  col2 小于 s2 的记录中取出

col1 和 col2  都是最大的一条记录

8 个解决方案

#1


select max(col1),max(col2) from a where col1<@s1 and col2<@s2

#2


select top 1 * from tb
where col1<(case when s1 is not null then s1 else col1+1 end)
and col2<(case when s2 is not null then s2 else col2+1 end)
order by col1 desc,col2 desc

两个都是最大的"一条记录"取不出来,因为我不能保证在一条记录里,它俩都是最大值.

#3


楼主把结构和数据贴出来,以及你想要的结果

#4


select * from tb
where col1<isnull(s1,col1+1) and col2<isnull(s2,col2+1)
order by col1 desc,col2 desc

#5


select max(col1),max(col2) from a 
 where col1<isnull(@s1,col1+1) or col2<isnull(s2,col2+1)

#6


表结构和数据

CREATE TABLE [dbo].[CarCustomMaintenanceData_tbl](
[CCMD_ID] [int] IDENTITY(1,1) NOT NULL,
[S_ID] [int] NULL,
[CM_ID] [int] NULL,
[CCDM_Name] [nvarchar](50) NULL,
[CMP_Mil] [float] NULL,
[CMP_Time] [float] NULL,
[CCMD_Time] [datetime] NULL,
[CCMD_UserID] [bigint] NULL)

SET IDENTITY_INSERT [CarCustomMaintenanceData_tbl] ON

INSERT [CarCustomMaintenanceData_tbl] ([CCMD_ID],[S_ID],[CM_ID],[CCDM_Name],[CMP_Mil],[CMP_Time]) VALUES ( 1,1,1,N'A套餐',5000,100)
INSERT [CarCustomMaintenanceData_tbl] ([CCMD_ID],[S_ID],[CM_ID],[CCDM_Name],[CMP_Mil],[CMP_Time]) VALUES ( 2,1,1,N'B套餐',10000,200)
INSERT [CarCustomMaintenanceData_tbl] ([CCMD_ID],[S_ID],[CM_ID],[CCDM_Name],[CMP_Mil],[CMP_Time]) VALUES ( 3,1,1,N'C套餐',15000,300)
INSERT [CarCustomMaintenanceData_tbl] ([CCMD_ID],[S_ID],[CM_ID],[CCDM_Name],[CMP_Mil],[CMP_Time]) VALUES ( 4,1,1,N'D套餐',20000,400)

SET IDENTITY_INSERT [CarCustomMaintenanceData_tbl] OFF

给出2个参数 分别对应 CMP_Mil 和 CMP_Time  其中一个参数可能为空(null or '')
条件1 对应的值必须比给定的参数小
条件2 在所有满足了条件1的记录中取 CMP_Mil 和CMP_Time 最大的记录  

#7


条件1 对应的值中和任意一个比给定的参数小  (or关系)

#8


这个最接近 但是 如果其中一个有空的话 就错误

引用 4 楼 qianjin036a 的回复:
SQL code
select * from tb
where col1<isnull(s1,col1+1) and col2<isnull(s2,col2+1)
order by col1 desc,col2 desc

#1


select max(col1),max(col2) from a where col1<@s1 and col2<@s2

#2


select top 1 * from tb
where col1<(case when s1 is not null then s1 else col1+1 end)
and col2<(case when s2 is not null then s2 else col2+1 end)
order by col1 desc,col2 desc

两个都是最大的"一条记录"取不出来,因为我不能保证在一条记录里,它俩都是最大值.

#3


楼主把结构和数据贴出来,以及你想要的结果

#4


select * from tb
where col1<isnull(s1,col1+1) and col2<isnull(s2,col2+1)
order by col1 desc,col2 desc

#5


select max(col1),max(col2) from a 
 where col1<isnull(@s1,col1+1) or col2<isnull(s2,col2+1)

#6


表结构和数据

CREATE TABLE [dbo].[CarCustomMaintenanceData_tbl](
[CCMD_ID] [int] IDENTITY(1,1) NOT NULL,
[S_ID] [int] NULL,
[CM_ID] [int] NULL,
[CCDM_Name] [nvarchar](50) NULL,
[CMP_Mil] [float] NULL,
[CMP_Time] [float] NULL,
[CCMD_Time] [datetime] NULL,
[CCMD_UserID] [bigint] NULL)

SET IDENTITY_INSERT [CarCustomMaintenanceData_tbl] ON

INSERT [CarCustomMaintenanceData_tbl] ([CCMD_ID],[S_ID],[CM_ID],[CCDM_Name],[CMP_Mil],[CMP_Time]) VALUES ( 1,1,1,N'A套餐',5000,100)
INSERT [CarCustomMaintenanceData_tbl] ([CCMD_ID],[S_ID],[CM_ID],[CCDM_Name],[CMP_Mil],[CMP_Time]) VALUES ( 2,1,1,N'B套餐',10000,200)
INSERT [CarCustomMaintenanceData_tbl] ([CCMD_ID],[S_ID],[CM_ID],[CCDM_Name],[CMP_Mil],[CMP_Time]) VALUES ( 3,1,1,N'C套餐',15000,300)
INSERT [CarCustomMaintenanceData_tbl] ([CCMD_ID],[S_ID],[CM_ID],[CCDM_Name],[CMP_Mil],[CMP_Time]) VALUES ( 4,1,1,N'D套餐',20000,400)

SET IDENTITY_INSERT [CarCustomMaintenanceData_tbl] OFF

给出2个参数 分别对应 CMP_Mil 和 CMP_Time  其中一个参数可能为空(null or '')
条件1 对应的值必须比给定的参数小
条件2 在所有满足了条件1的记录中取 CMP_Mil 和CMP_Time 最大的记录  

#7


条件1 对应的值中和任意一个比给定的参数小  (or关系)

#8


这个最接近 但是 如果其中一个有空的话 就错误

引用 4 楼 qianjin036a 的回复:
SQL code
select * from tb
where col1<isnull(s1,col1+1) and col2<isnull(s2,col2+1)
order by col1 desc,col2 desc