0

SQLServerに[Donations]というテーブルがあります。このテーブルにはさまざまな人からの寄付が含まれています。

そのフィールドは次のとおりです。

FirstName,LastName,FullName,Description --VARCHARs
DateOrdered, --DATE
Donation     --MONEY

表のすべてのフィールドを返したいのですが、すべての寄付ではなく、各人の最大の寄付記録のみが必要です。

テーブルに8つのレコードが含まれ、John Doeには5つの寄付レコードがあり、Jane Doeには3つのレコードがあるとします。彼が行った最大の寄付であるJohnの寄付レコードと、彼女であるJaneの寄付レコードを取得するクエリを作成します。最大の寄付。

これをSQLで書くにはどうすればよいですか?

助けてくれてありがとう。

4

3 に答える 3

3
select
  *
from
  donations d
where
  donation=(select max(donation) from donations where fullname=d.fullname group by fullname)

これは、フルネームがこのテーブルのPKであると想定しています。

于 2012-06-30T01:56:53.723 に答える
1

ランキング関数を使用した例を次に示します。

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
于 2012-06-30T08:19:27.753 に答える
0

これを試して:

select d1.*,(select max(d2.donation) where d2.fullname=d1.fullname group d2.fullname) from donation d1;
于 2012-06-30T09:18:30.273 に答える