0

我有这个数据。我需要为每个人获取最低的 $ 完整行。

Amount Date    Name
$123   Jun 1   Peter
$120   Jun 5   Peter
$123   Jun 5   Paul
$100   Jun 1   Paul
$220   Jun 3   Paul

SQl Server 查询的结果应该是:

$120   Jun 5   Peter
$100   Jun 1   Paul
4

5 回答 5

3

SQL Server 2005+ 版本

;WITH CTE AS
(
    SELECT
        Amount, [Date], Name,
        ROW_NUMBER() OVER (PARTITION BY Name ORDER BY [Amount]) AS RowNum
    FROM Table
)
SELECT *
FROM CTE
WHERE RowNum = 1

替代版本

SELECT t.Amount, t.[Date], t.Name
FROM
(
    SELECT Name, MIN(Amount) AS MinAmount
    FROM Table
    GROUP BY Name
) m
INNER JOIN Table t
    ON t.Name = m.Name
    AND t.Amount = m.Amount
于 2010-02-01T18:38:04.333 回答
2

一种适用于 SQL Server 7 及更高版本的方法

select t1.* 
from(select min(amount) Minamount,name
from Yourtable
group by name) t2 
join Yourtable t1 on t1.name = t2.name
and t1.amount = t2.Minamount

有几种方法可以解决这个问题,请参见此处:包括聚合列的相关值

于 2010-02-01T18:38:28.173 回答
1
SELECT * FROM TableName T1 WHERE NOT EXISTS 
    (SELECT * FROM TableName T2 
    WHERE T2.Name = T1.Name AND T2.Amount < T1.Amount)

在平局的情况下,两行都将在这种情况下显示。

于 2010-02-01T18:37:04.897 回答
1

对人员进行分组以获得每个人的最低金额,然后加入表格以获取每行的日期:

select y.Amount, y.Date, y.Name
from (
  select min(Amount), Name
  from TheTable
  group by Name
) x
inner join TheTable y on x.Name = y.Name and x.Amount = y.Amount

如果金额可以存在于一个人的多个日期,请选择其中一个日期,例如第一个日期:

select y.Amount, min(y.Date), y.Name
from (
  select min(Amount), Name
  from TheTable
  group by Name
) x
inner join TheTable y on x.Name = y.Name and x.Amount = y.Amount
group by y.Amount, y.Name
于 2010-02-01T18:41:48.787 回答
1

不是最有效的,但更易于阅读:

SELECT DISTINCT [Name], [Date], MIN([Amount]) OVER(PARTITION BY [Name])
FROM #Table
于 2010-02-01T19:54:31.117 回答