选择具有打破平局逻辑的MAX记录

时间:2015-04-16 16:05:58

标签: sql tsql

使用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
    )

3 个答案:

答案 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