用于根据最小值标识行的SQL脚本

时间:2018-03-14 22:40:46

标签: sql sql-server

如何编写SQL语句(在SQL Server中)以获取基于两列的最小值的行?

例如:

Type    Rank    Val1     val2
------------------------------
A          6    486.57  38847
B          6    430     56345
C          5    390     99120
D          5    329     12390
E          4    350     11109
E          4    320     11870

SQL语句应返回上表中的最后一行,因为它具有Rank和Val1的最小值。

3 个答案:

答案 0 :(得分:1)

这样的事情:

select *
from Table1
where rank = (select min(rank) from Table1)
    and Val1 = (select min(Val1) 
                from Table1 
                where rank = (select min(rank) from Table1))

或者,如果你喜欢简单的生活:

select top 1 *
from Table1
order by rank asc, Val1 asc

答案 1 :(得分:1)

with cte as (
   select *, row_number() over (order by rank, val1) as rn
   from dbo.yourTable
)
select *
from cte
where rn = 1;

这里的想法是我根据排名为行分配1..n枚举,在绑定的情况下,为Val1。我返回值为1的行。如果有可能出现平局,请使用rank()代替row_number()

答案 2 :(得分:0)

我假设 Type 是您的表的主键,并且您只想要一个具有最低Val1和最低Val2的行(因此,如果一行具有最低Val1,但不是最低的Val2,这不会返回数据)。我不确定这些假设,但你的问题可能会被澄清一点 这是代码:

SELECT 
    *
FROM 
    Table1
WHERE 
    Type IN 
    (
    SELECT 
        Type 
    FROM 
        Table1 
    GROUP BY 
        Type 
    HAVING 
        MIN(Val1) AND MIN(val2)
    )