4

我有一张桌子

ID,  name, pay1, pay2
 1     a,    3,    2
 2     b,   12,    4
 3     b,    4,    8
 4     c,    8,    7
 5     c,    5,    2
 6     a,    7,    1

我想选择每个名字的 pay1 + pay2 最小的行。所以,我想得到

 ID,  name, pay1, pay2
 1     a,    3,    2
 3     b,    4,    8
 5     c,    5,    2

知道如何在 SQL Server 中做到这一点吗?谢谢

4

3 回答 3

5

使用排名函数:

with minpay as
(
  select *
    , payrank = row_number() over (partition by name order by pay1 + pay2, ID)
  from pay
)
select ID
  , name
  , pay1
  , pay2
from minpay
where payrank = 1
order by name

SQL Fiddle 与演示

于 2013-03-16T01:23:24.723 回答
3

OP doesn't mention how possible ties are to be treated, but:

select t1.* 
from table1 t1 join
(select id, sum(pay1 + pay2) as sumpay 
from table1  
group by id) s on t1.id = s.id
join 
(select name, min(pay1 + pay2) as sumpay 
from table1 
group by name) t on t.sumpay = s.sumpay 

I posted this and then saw Ian's answer which is clearer.

SQLFiddle with Demo.

于 2013-03-16T01:27:24.827 回答
0

这是另一种选择。

这将显示最小值的平局。正如@MitchWheat 指出的那样,问题并没有具体说明如何处理这些问题。

SELECT a.Id, a.Name, a.Pay1, a.Pay2
FROM [table] a INNER JOIN (
    SELECT Name, MIN(Pay1 + Pay2) as MinPay
    FROM [table]
    GROUP BY Name
) b ON a.Name = b.Name
    AND a.Pay1 + a.Pay2 = b.MinPay
于 2013-03-16T01:37:30.067 回答