查询以获取每个人的最大捐款

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;

【讨论】:

以上是关于查询以获取每个人的最大捐款的主要内容,如果未能解决你的问题,请参考以下文章

Sql查询选择这个用户所在的每个组内每个人的所有消息

获取每个 ID 的最大值的简单查询

Hive 查询以获取最大计数

子查询 django 查询以从对象中获取最大的不同值并返回这些对象

如何设置子查询以获取具有最新日期和最大 ID 的单个记录?

春季启动查询以单独从子文档数组中的字段中获取最大值