使用Max SQL以外的版本

时间:2017-01-25 14:15:06

标签: sql sql-server ssis

我有一个包含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

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

4 个答案:

答案 0 :(得分:2)

要获得第二个结果集,请使用以下内容。没有运行查询

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

答案 1 :(得分:2)

您可以使用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

答案 2 :(得分:2)

使用 common table expression

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

<小时/> 的 top with ties

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]
带有max([Version]) common table expression 版本的

over()
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]

答案 3 :(得分:0)

如果您已经获得了MAX(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 
    )