我正在尝试获得一个范围,其中一个数字将下降,该范围将是从表的列的值创建的,例如。假设有一列'num1‘,它包含数据(12,15,10,40,20,5),我给23作为要搜索的数字,那么我可以得到'20和40’的输出。
我可以通过两个查询来实现所需的输出,但我希望有一个查询,列将具有唯一的值,因此如果列值匹配,则范围将是该数字及其最接近的较小值。如果输入为15,则输出将为12和15列值:(12,15,10,40,20,5)搜索值:30所需输出:'20和40‘
发布于 2019-06-14 12:56:49
也许像这样的东西会对你有利。使用LEAD()和LAG()窗口函数获取行的上一个和下一个值。
DECLARE @T TABLE(Number INT)
INSERT @T VALUES(12),(15),(10),(40),(20),(5)
SELECT
Number,
NextNumber = ISNULL(LEAD(Number) OVER (PARTITION BY 1 ORDER BY Number),Number),
LastNumber = ISNULL(LAG(Number) OVER (PARTITION BY 1 ORDER BY Number),Number)
FROM
T
从积累表中,您现在需要在可接受的范围内匹配输入,并选择最佳匹配(在本例中,它是最接近范围开始/结束的)。
DECLARE @NumberToSearch INT =23
;WITH Ranges AS
(
SELECT
Number,
RangeStart = ISNULL(LAG(Number) OVER (PARTITION BY 1 ORDER BY Number) ,Number),
RangeEnd = ISNULL(LEAD(Number) OVER (PARTITION BY 1 ORDER BY Number) , Number)
FROM
@T
)
,ApplicableRanges AS
(
SELECT
Number,
RangeStart,
RangeEnd,
Instance = ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY RangeStart)
FROM
Ranges R
WHERE
@NumberToSearch BETWEEN R.RangeStart AND R.RangeEnd
)
SELECT * FROM ApplicableRanges WHERE Instance = 1
https://stackoverflow.com/questions/56490987
复制相似问题