采用 Max SQL 以外的版本



我有一个有 4 列的表格。我想检索数字,代码和序列号组合的最高版本。如果有多个版本,其余版本我需要另一个结果集。

Number  Version Code    Serial No
12345   1        VB      88
12345   2        VB      88
23456   1        VB      44
33334   1        VB      55
33334   2        VB      55
33334   3        VB      55

在一个表中,我只需要每个数字,代码,序列号的最高问题。我的结果1

Number  Version Code    Serial No
12345   2        VB      88
23456   1        VB      44
33334   3        VB      55

另一个结果集

Number  Version Code    Serial No
12345   1        VB      88
33334   1        VB      55
33334   2        VB      55

无论如何,我可以使用查询获得第一组。怎么能得到第二套。不使用临时表。

要获取第二个结果集,请使用如下所示的内容。无法运行查询

select * from 
(select t.*,
    row_number() over (partition by number,code,SerialNo order by version desc) as rnk
from table t) 
where rnk <> 1
您可以使用

row_number 函数获取两个结果,更改where条件。

select number,version,code,serialno
from (select t.*
      ,row_number() over(partition by number,code,serialno order by version desc) as rnum
      from tablename t
     ) x
where rnum > 1 --rnum=1 for the first result

row_number()常用表表达式
cte.rn=1更改为cte.rn!=1以获取第二个结果集

with cte as (
  select   
      t.*
    , rn = row_number() over (
            partition by t.[Number], t.[Code], t.[Serial No]
            order by t.[Version] desc
            )
    from tbl t
)
select cte.*
  from cte
  where cte.rn = 1


上衣系带
select top 1 with ties
    t.*
  from tbl t
  order by row_number() over (
    partition by t.[Number], t.[Code], t.[Serial No] 
    order by t.[Version] desc)

第二个结果集:

select t.*
from tbl t
except 
select top 1 with ties
    t.*
  from tbl t
  order by row_number() over (
    partition by t.[Number], t.[Code], t.[Serial No] 
    order by t.[Version] desc)

max(version)上的内部连接:
m.[Version] = t.[Version]更改为m.[Version] != t.[Version]以获取第二个结果集

select t.* 
  from tbl t
    inner join (
      select m.[Number], m.[Code], m.[Serial No], Version = max(m.[Version])
      from tbl m
      group by m.[Number], m.[Code], m.[Serial No]
      ) 
      on m.[Number] =  t.[Number]
        and m.[Code] =  t.[Code]
        and m.[Serial No] = t.[Serial No]
        and m.[Version] = t.[Version]

具有 over() 版本的max([Version])公用表表达式
m.[Version] = t.[Version]更改为m.[Version] != t.[Version]以获取第二个结果集

with cte as (
  select 
       t.*
    , MaxVersion = max([Version]) over (
            partition by t.[Number], t.[Code], t.[Serial No]
            )
    from tbl t
)
select cte.[Number], cte.[Code], cte.[Serial No], cte.[Version]
  from cte
  where cte.MaxVersion = cte.[Version]

如果您已经有查询来获取 MAX(VERSION),那么将其用作子查询是合乎逻辑的。

最大(版本):

SELECT NUMBER,CODE,SERIAL,MAX(VERSION) 
    FROM Q
    GROUP BY NUMBER,CODE,SERIAL 

其余的:

SELECT NUMBER,CODE,SERIAL,VERSION 
    FROM Q
    WHERE (NUMBER,CODE,SERIAL,VERSION) NOT IN (
        SELECT NUMBER,CODE,SERIAL,MAX(VERSION) 
            FROM Q
            GROUP BY NUMBER,CODE,SERIAL 
    )  

最新更新