按日期和用户获取表中的最新记录

use*_*055 1 sql-server greatest-n-per-group

我有一张如下表:

SELECT [EffectiveDate]
      ,[Rate]
      [ModUser]
      FROM [Vision]
Run Code Online (Sandbox Code Playgroud)

有很多行带有 ModUsers 名称。我需要提供 ModUsers 名称并获取最新费率。

我怎么做?

Sql*_*Zim 8

有很多方法可以做到这一点。这里是其中的一些:

row_number()版本的公共表表达式

with cte as (
  select  *
      , rn = row_number() over (
              partition by ModUser
              order by EffectiveDate desc
            )

    from Vision
)
select ModUser, EffectiveDate, Rate
  from cte
  where rn = 1;
Run Code Online (Sandbox Code Playgroud)

cross apply 版本:

 select distinct
     t.ModUser
   , x.EffectiveDate
   , x.Rate

  from Vision t
    cross apply (
      select top 1
            ModUser
          , EffectiveDate
          , Rate
        from Vision i
        where i.ModUser = t.ModUser
        order by i.EffectiveDate desc
       ) as x;
Run Code Online (Sandbox Code Playgroud)

top with ties 版本:

select top 1 with ties
    *
  from Vision
  where 
  order by 
    row_number() over (
      partition by ModUser
          order by EffectiveDate desc
      );
Run Code Online (Sandbox Code Playgroud)

inner join 版本:

select 
      v.ModUser
    , v.EffectiveDate
    , v.Rate
  from Vision v
    inner join (
      select 
          ModUser
        , MaxEffectiveDate = max(i.EffectiveDate) 
        from Vision i 
        group by ModUser
       ) as x on x.ModUser          = v.ModUser
             and x.MaxEffectiveDate = v.EffectiveDate;
Run Code Online (Sandbox Code Playgroud)