我有一个包含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
无论如何,我可以使用查询获得第一组。 如何获得第二套。不使用临时表。
答案 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)
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
)