使用SQL Server 2014
我有一张包含四个字段的表格。每条记录都包含一份单独的捐款。从同一个捐赠者那里获得两次单独的捐赠可能会有相同的金额,甚至相同的日期(比如他们在某一天给出了相同的金额两次 - 很少见但却发生了)。
我希望返回一个包含每个捐赠者最大贡献的完整记录的集合。如果有两笔最大金额的捐款,请选择最近的金额。如果同一天有两个最大贡献,则返回IDNumber最高的那个(表示他们输入系统的顺序)
我的头脑爆炸事件正在考虑这个,所以我把它放到了小组。
CREATE TABLE [dbo].[Donations1](
[IDNumber] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[DonorIDNumber] [int] NOT NULL,
[DTGCreated] [datetime2](7) NOT NULL,
[TransactionDate] [datetime2](7) NOT NULL,
[Amount] [numeric](18, 2) NOT NULL
)
答案 0 :(得分:1)
您可以使用ROW_NUMBER()
功能执行此操作:
;with cte AS (SELECT *, ROW_NUMBER() OVER(PARTITION BY DonorIDNumber ORDER BY Amount DESC, TransactionDate DESC, IDNumber DESC) AS RN
FROM Donations1
)
SELECT *
FROM cte
WHERE RN = 1
ROW_NUMBER()
函数为每一行分配一个数字。 PARTITION BY
是可选的,但用于为给定组中的每个值开始编号,即:如果您PARTITION BY
DonorIDNumber
,那么对于每个捐赠者,编号将从1开始。{ {1}}当然用于定义计数应该如何进行,并且在ROW_NUMBER()函数中是必需的。
答案 1 :(得分:0)
使用ROW_NUMBER对记录进行排名,以便您想要的记录获得第1行:
select *
from
(
select
donations1.*,
row_number() over (partition by donoridnumber order by amount desc, transactiondate desc, idnumber desc) as rn
from donations1
) donations
where rn = 1;
答案 2 :(得分:0)
我认为窗口功能很简单:
;with cte as(
select *, Row_Number() over(partition by DonorID order by Amount desc, DateCreated desc, ID desc) as rn from Donations
)
select * from cte where rn = 1