【问题标题】:Select next highest data element in a series of values在一系列值中选择下一个最高数据元素
【发布时间】:2017-03-10 10:37:30
【问题描述】:

我有一个表格,其中列出了负责货币阈值的个人。表Thresholds 看起来像:

John Smith    5000.00
Carla Smith   3000.00
Anna Smith    1000.00

我正在尝试制作一个选择语句,我可以在其中返回个人姓名以获得下一个最高阈值。所以我有一个 1500.00 的订单。我想返回 Carla 的名字,因为该值高于 Anna 的值,但我不想将 John 视为一个选项。

你会推荐什么?

【问题讨论】:

  • 您能否提供更多表格示例(包含行和列)以及预期输出示例?
  • 是的,抱歉,我尝试使用空间让我的帖子看起来更干净,显然它比我更聪明!
  • 是的,对不起,我尝试使用空间让我的帖子看起来更干净,显然它比我更聪明! SELECT Name AS [Escalate To] FROM dbo.ThresholdLimits T JOIN dbo.Orders O ON T.Company=O.Company WHERE O.Company='Corp' AND T.Limit > O.Amount 这是我不确定的地方继续我的 WHERE 条款。金额=1500.00,用户的限额为1000.00。 SELECT 应该返回下一个最高用户的名称,例如 Anna 的限制为 1000,订单为 1500。下一个最高授权用户是 Carla,限制为 3000。

标签: sql-server tsql select sql-server-2012


【解决方案1】:

使用TOP

Select top 1 * from table Where value >= 1500 order by value

【讨论】:

    【解决方案2】:
    Declare @YourTable table (Name varchar(50),SomeValue int)
    Insert Into @YourTable values
    ('John Smith',5000),
    ('Carla Smith',3000),
    ('Anna Smith',1000)
    
    ;with cte as (
        Select *,RN=Row_Number() over (Order by SomeValue) 
        From  @YourTable
        Where SomeValue >= 1500
    )
    Select * from cte where RN=1
    

    返回

    Name        SomeValue   RN
    Carla Smith 3000        1
    

    或者有@James 的建议(以防平局)

    ;with cte as (
        Select *,Rnk=Dense_Rank() over (Order by SomeValue) 
        From  @YourTable
        Where SomeValue >= 1500
    )
    Select * from cte where Rnk=1
    

    【讨论】:

    • 使用dense_rank() 代替Row_Number() 不是更好吗?
    • @James 也许,但如果他们设置层级,他们往往不会重叠。就像感冒的鸡汤......不会受伤。 :)
    • @James 包含您的建议
    猜你喜欢
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 2021-07-16
    相关资源
    最近更新 更多