【问题标题】:Is there any way to create range from table column with random value有没有办法从具有随机值的表列创建范围
【发布时间】:2019-06-07 08:49:02
【问题描述】:

我正在尝试获取一个数字将落在其中的范围,该范围将由表的列的值创建,例如。假设有一列 'num1' 包含数据 (12,15,10,40,20,5),我给 23 作为搜索的数字,然后我可以得到输出为 '20 和 40'

我可以通过两个查询实现所需的输出,但我想要一个查询, 列将具有唯一值,因此如果列值匹配,则范围将是数字及其最接近的较小值。如果输入为 15,则输出为 12 和 15 列值:(12,15,10,40,20,5) 搜索值:30 所需输出:'20 and 40'

【问题讨论】:

  • 搜索值 15 的预期结果是什么? 5? 4?
  • @jarlh 对于 15,它将是“12 和 15”,搜索的随机值将介于该列的最低和最高值之间,即介于 5 到 40 之间,抱歉我错过了跨度>

标签: sql sql-server-2008 sql-server-2012


【解决方案1】:

也许这样的事情会对你有利。使用 LEAD() AND LAG() 窗口函数来获取一行的上一个和下一个值。

Sql Fiddle

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-07
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2019-04-24
    相关资源
    最近更新 更多