查询以获取每个人的最大捐款
Posted
技术标签:
【中文标题】查询以获取每个人的最大捐款【英文标题】:Query to get max donation from each person 【发布时间】:2012-06-30 01:42:16 【问题描述】:我在 SQL Server 中有一个名为 [Donations] 的表,其中包含不同人提供的捐款。
它的字段是:
FirstName,LastName,FullName,Description --VARCHARs
DateOrdered, --DATE
Donation --MONEY
我希望返回表格中的所有字段,但我只想要每个人最大的捐赠记录,而不是他们的所有捐赠。
假设表格包含 8 条记录,John Doe 有 5 条捐赠记录,而 Jane Doe 有 3 条。 我想写一个查询,它将为我提供约翰的最大捐赠记录和简的最大捐赠记录。
如何用 SQL 编写?
非常感谢您的帮助。
【问题讨论】:
【参考方案1】:select
*
from
donations d
where
donation=(select max(donation) from donations where fullname=d.fullname group by fullname)
这假定 fullname 是您在此表上的 PK。
【讨论】:
如果此人在不同日期捐赠的最大金额相同,这将返回多行 是的,我想我需要对此进行更好的PK。不过,这会对我有所帮助。谢谢。【参考方案2】:这是一个使用排名函数的示例:
DECLARE @Donations TABLE (FirstName VARCHAR(128),LastName VARCHAR(128),
FullName VARCHAR(256),Description VARCHAR(1024),
DateOrdered DATETIME, Donation DECIMAL)
INSERT @Donations VALUES
('John', 'Doe', 'John Doe', '', '20120605', 125),
('John', 'Doe', 'John Doe', '', '20120603', 12.34),
('John', 'Doe', 'John Doe', '', '20120602', 13.59),
('John', 'Doe', 'John Doe', '', '20120609', 125),
('John', 'Doe', 'John Doe', '', '20120601', 15),
('Jane', 'Doe', 'Jane Doe', '', '20120612', 155),
('Jane', 'Doe', 'Jane Doe', '', '20120613', 152),
('Jane', 'Doe', 'Jane Doe', '', '20120612', 155)
-- Return maximum donations including duplicate donations
-- on different and same dates
;WITH a AS
(
SELECT *,
DENSE_RANK() OVER (PARTITION BY FullName
ORDER BY Donation DESC) DenseRank
FROM @Donations
)
SELECT *
FROM a
WHERE DenseRank = 1
ORDER BY Donation DESC, DateOrdered DESC
-- Return maximum donations including duplicate donations on same dates,
-- excluding duplicate donations on different dates
;WITH a AS
(
SELECT *,
DENSE_RANK() OVER (PARTITION BY FullName
ORDER BY Donation DESC, DateOrdered DESC) DenseRank
FROM @Donations
)
SELECT *
FROM a
WHERE DenseRank = 1
ORDER BY Donation DESC, DateOrdered DESC
-- Return maximum donations excluding duplicate donations
-- on same and different dates
;WITH a AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY FullName
ORDER BY Donation DESC, DateOrdered DESC) RowNum
FROM @Donations
)
SELECT *
FROM a
WHERE RowNum = 1
ORDER BY Donation DESC, DateOrdered DESC
【讨论】:
【参考方案3】:试试这个:
select d1.*,(select max(d2.donation) where d2.fullname=d1.fullname group d2.fullname) from donation d1;
【讨论】:
以上是关于查询以获取每个人的最大捐款的主要内容,如果未能解决你的问题,请参考以下文章