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