SQL Server选择每个ID的最大日期

时间:2014-10-17 09:32:14

标签: sql sql-server greatest-n-per-group

我正在尝试为每个finance_charge_id选择每个service_user_id的最大日期记录,并为最高日期链接的金额

select distinct 
    s.Finance_Charge_ID, MAX(s.start_date), s.Amount  
from
    Service_User_Finance_Charges s
where 
    s.Service_User_ID = '156'
group by 
    s.Finance_Charge_ID, s.Amount

问题是我收到的金额不同的多个条目。我只想收到每个finance_charge_id

的最新日期金额

目前我收到的内容不正确(第三行不应出现,因为第一行的日期更高)

Finance_Charge_ID   (No column name)    Amount
2                      2014-10-19       1.00
3                      2014-10-16       500.00
2                      2014-10-01       1000.00

2 个答案:

答案 0 :(得分:4)

从组中删除Amount列以获取正确的行。然后,您可以再次将该查询加入到表中,以获取所需的所有数据。以下是使用CTE获取最大日期的示例:

WITH MaxDates_CTE (Finance_Charge_ID, MaxDate) AS
(
    select  s.Finance_Charge_ID, 
            MAX(s.start_date) MaxDate
    from Service_User_Finance_Charges s
    where  s.Service_User_ID = '156'
    group by s.Finance_Charge_ID
)

SELECT *
FROM Service_User_Finance_Charges
JOIN MaxDates_CTE 
    ON MaxDates_CTE.Finance_Charge_ID = Service_User_Finance_Charges.Finance_Charge_ID
    AND MaxDates_CTE.MaxDate = Service_User_Finance_Charges.start_date

答案 1 :(得分:1)

这可以使用窗口函数来完成,该函数不需要对分组数据进行自联接:

select Finance_Charge_ID,
       start_date,
       amount
from (
  select s.Finance_Charge_ID, 
         s.start_date,
         max(s.start_date) over (partition by s.Finance_Charge_ID) as max_date,
         s.Amount  
  from Service_User_Finance_Charges s
  where s.Service_User_ID = 156
) t
where start_date = max_date;

由于窗口功能不需要您使用group by,您可以在输出中添加所需的任何其他列。