如何获得组合列的最大值?

Gar*_*ary 2 sql-server

我有下面的表: filenamefiletypeversionrevision

我想编写一个查询,为 a and找到最高的 versionAND 。例如,以下将起作用:revisionfilenamefiletype

select 
 filename 
,filetype
,max(version + revision) as combined
from dmkr_asline.cmires_lbyi
group by filename, filetype
order by filename, filetype;
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够返回versionrevision作为单独的列,以便我可以加入另一个表。我不能使用max,因为我想在每列max revisionmax version

Sql*_*Zim 6

使用top with tieswithrow_number()获取每个andrevision的最高值的行。versionfilenamefiletype

select top 1 with ties
    filename 
  , filetype
  , version
  , revision
from dmkr_asline.cmires_lbyi
order by row_number() over (
  partition by filename, filetype 
  order by version desc, revision desc
  );
Run Code Online (Sandbox Code Playgroud)

替代使用公用表表达式row_number()

;with cte as (
  select
      filename 
    , filetype
    , version
    , revision
    , rn = row_number() over (
        partition by filename, filetype 
        order by version desc, revision desc
        )
  from dmkr_asline.cmires_lbyi
)
select 
      filename 
    , filetype
    , version
    , revision
from cte
where rn = 1
order by filename, filetype
Run Code Online (Sandbox Code Playgroud)

cross apply() 版本:

select distinct
    t.filename 
  , t.filetype
  , x.version
  , x.revision
from dmkr_asline.cmires_lbyi t
  cross apply (
    select top 1
        i.version
      , i.revision
    from dmkr_asline.cmires_lbyi as i
    where i.filename = t.filename
      and i.filetype = t.filetype
    order by i.version desc, i.revision desc
    ) as x
Run Code Online (Sandbox Code Playgroud)

inner join 版本:

select 
    t.filename 
  , t.filetype
  , x.version
  , revision = max(t.revision)
from dmkr_asline.cmires_lbyi t
  inner join (
    select 
        i.filename
      , i.filetype
      , version = max(i.version)
    from dmkr_asline.cmires_lbyi i
    group by
        i.filename
      , i.filetype
    ) as x
    on x.filename = t.filename
   and x.filetype = t.filetype
   and x.version  = t.version
group by
    t.filename 
  , t.filetype
  , x.version
Run Code Online (Sandbox Code Playgroud)

  • @Shaulinator我不明白为什么不能使用`max() over (partition by ...)`来编写解决方案,但获得最新版本和最新版本可能需要更多的工作使用这种方法的版本。 (2认同)