如何根据列获得上限值
How to get just upper value based on column
我有一个 table 测试,有票和车辆。
ticket vehicle
1000 101
1001 102
1002 102
1003 103
1004 104
1005 102
1006 102
我的要求:输入将是车票,输出将是vehicle.If 车辆在重复,那么我必须只获得前一张车票。
例如:票1006有车辆102即repeating.I表示1006,1005,1002,1001票有车辆102.So如果输入是1006 则输出为 1005。同样,如果输入为 1005,则输出将为 1002.And 如果输入为 1002,则输出将为 1001。
我喜欢这个
SELECT ticket
FROM (SELECT ROW_NUMBER() OVER (ORDER BY ticket desc) AS RowNumber, *
FROM test
WHERE vehicle = (SELECT vehicle FROM test WHERE ticket = 1005)) AS getsecondsLast
WHERE RowNumber = 2
但这只有在输入为 1006 时才能正常工作。
请帮帮我fiddle here
类似于:
Select *
from test outer_test
outer apply
(select max(ticket) as Previous_Ticket from
test inner_test
where inner_test.vehicle = outer_test.vehicle
and outer_test.ticket > inner_test.ticket) previous
MS SQL Server 2014 架构设置:
create table test(
ticket int,vehicle int);
insert into test values(1000,101);
insert into test values(1001,102);
insert into test values(1002,102);
insert into test values(1003,103);
insert into test values(1004,104);
insert into test values(1005,102);
insert into test values(1006,102);
查询 1:
declare @ticket int = 1005;
select top(1) T1.ticket
from dbo.test as T1
where T1.ticket < @ticket and
T1.vehicle in (
select T2.vehicle
from dbo.test as T2
where T2.ticket = @ticket
)
order by T1.ticket desc;
| ticket |
|--------|
| 1002 |
http://sqlfiddle.com/#!6/ca9cd/22
DECLARE @ticket int = 1006
select MAX(prev.ticket) from test curr
inner join test prev
on curr.vehicle = prev.vehicle
AND curr.ticket > prev.ticket
where curr.ticket = @ticket
这是另一种方式:
如果 Vehicle
没有重复,这将 return 原始票。
DECLARE @ticket INT = 1002
;WITH CteUnion AS(
SELECT *
FROM Test
WHERE
Ticket = @ticket
UNION ALL
SELECT *
FROM Test
WHERE
Vehicle = (SELECT Vehicle FROM Test WHERE Ticket = @ticket)
AND Ticket < @ticket
),
CteNumbered AS(
SELECT *,
RN =
ROW_NUMBER() OVER(
ORDER BY
CASE
WHEN Ticket = @ticket THEN -1
ELSE Ticket
END
DESC
)
FROM CteUnion
)
SELECT Ticket, Vehicle
FROM CteNumbered
WHERE RN = 1
这样你就可以得到你想要的答案。
看看这个fiddle
查询:
Select ticket, vehicle, (Case When Output IS NULL Then ticket else Output End) As PrevTicket
from test t1
outer apply (select max(ticket) as Output from test t2
where t1.vehicle = t2.vehicle and t2.ticket < t1.ticket) t3
您可以在此处添加 Where
条件以获得特定工单的输出。
Where ticket = 1005
我认为这是最简单的方法(如果车辆只有一张票,那么 return 票号为空)
DECLARE @ticket int = 1006
SELECT TOP 1 t2.ticket, t1.vehicle
FROM test t1 LEFT JOIN test t2 ON(t1.vehicle = t2.vehicle AND t2.ticket < t1.ticket)
WHERE t1.ticket = @ticket
ORDER BY t2.Ticket DESC
我有一个 table 测试,有票和车辆。
ticket vehicle
1000 101
1001 102
1002 102
1003 103
1004 104
1005 102
1006 102
我的要求:输入将是车票,输出将是vehicle.If 车辆在重复,那么我必须只获得前一张车票。
例如:票1006有车辆102即repeating.I表示1006,1005,1002,1001票有车辆102.So如果输入是1006 则输出为 1005。同样,如果输入为 1005,则输出将为 1002.And 如果输入为 1002,则输出将为 1001。 我喜欢这个
SELECT ticket
FROM (SELECT ROW_NUMBER() OVER (ORDER BY ticket desc) AS RowNumber, *
FROM test
WHERE vehicle = (SELECT vehicle FROM test WHERE ticket = 1005)) AS getsecondsLast
WHERE RowNumber = 2
但这只有在输入为 1006 时才能正常工作。
请帮帮我fiddle here
类似于:
Select *
from test outer_test
outer apply
(select max(ticket) as Previous_Ticket from
test inner_test
where inner_test.vehicle = outer_test.vehicle
and outer_test.ticket > inner_test.ticket) previous
MS SQL Server 2014 架构设置:
create table test(
ticket int,vehicle int);
insert into test values(1000,101);
insert into test values(1001,102);
insert into test values(1002,102);
insert into test values(1003,103);
insert into test values(1004,104);
insert into test values(1005,102);
insert into test values(1006,102);
查询 1:
declare @ticket int = 1005;
select top(1) T1.ticket
from dbo.test as T1
where T1.ticket < @ticket and
T1.vehicle in (
select T2.vehicle
from dbo.test as T2
where T2.ticket = @ticket
)
order by T1.ticket desc;
| ticket |
|--------|
| 1002 |
http://sqlfiddle.com/#!6/ca9cd/22
DECLARE @ticket int = 1006
select MAX(prev.ticket) from test curr
inner join test prev
on curr.vehicle = prev.vehicle
AND curr.ticket > prev.ticket
where curr.ticket = @ticket
这是另一种方式:
如果 Vehicle
没有重复,这将 return 原始票。
DECLARE @ticket INT = 1002
;WITH CteUnion AS(
SELECT *
FROM Test
WHERE
Ticket = @ticket
UNION ALL
SELECT *
FROM Test
WHERE
Vehicle = (SELECT Vehicle FROM Test WHERE Ticket = @ticket)
AND Ticket < @ticket
),
CteNumbered AS(
SELECT *,
RN =
ROW_NUMBER() OVER(
ORDER BY
CASE
WHEN Ticket = @ticket THEN -1
ELSE Ticket
END
DESC
)
FROM CteUnion
)
SELECT Ticket, Vehicle
FROM CteNumbered
WHERE RN = 1
这样你就可以得到你想要的答案。
看看这个fiddle
查询:
Select ticket, vehicle, (Case When Output IS NULL Then ticket else Output End) As PrevTicket
from test t1
outer apply (select max(ticket) as Output from test t2
where t1.vehicle = t2.vehicle and t2.ticket < t1.ticket) t3
您可以在此处添加 Where
条件以获得特定工单的输出。
Where ticket = 1005
我认为这是最简单的方法(如果车辆只有一张票,那么 return 票号为空)
DECLARE @ticket int = 1006
SELECT TOP 1 t2.ticket, t1.vehicle
FROM test t1 LEFT JOIN test t2 ON(t1.vehicle = t2.vehicle AND t2.ticket < t1.ticket)
WHERE t1.ticket = @ticket
ORDER BY t2.Ticket DESC