如何将此查询分组以获得所需结果

ne5o7dgx  于 2021-07-27  发布在  Java
关注(0)|答案(1)|浏览(341)

我有一张任务表。每个任务可以有多个版本(包括草稿版本)。
每个任务将共享一个guid
每个任务可以有多个版本
草稿由版本=0标记
我试图提出一个查询,将给我一个记录每项任务。
我应该总是得到任务的最高版本。
如果一个任务有一个草稿版本,我应该只看到它。
我无法控制表或数据的结构。
到目前为止,我正在尝试使用行数函数,但很难找到正确的解决方案。

declare @SWs TABLE
(
    Guid nvarchar(36),
    Version int,
    Title nvarchar(50),
    IsLatestVersion bit
)

INSERT INTO @SWs
select 'guid1', 1, 'StandardWork1', 1
union
select 'guid2', 1, 'StandardWork2', 0
union
select 'guid3', 1, 'StandardWork3', 1
union
select 'guid4', 1, 'StandardWork4', 1
union
select 'guid1', 0, 'StandardWork1(Draft)', 0
union
select 'guid5', 0, 'StandardWork5(Draft)', 0
union
select 'guid2', 2, 'StandardWork2.2', 1

--QUERY SHOULD RETURN ONLY ONE ROW PER GUID
--ALWAYS SHOW MAX VERSION UNLESS THERE IS DRAFT, THEN SHOW DRAFT
select 
ROW_NUMBER() OVER(PARTITION BY Guid ORDER BY Version, IsLatestVersion desc) as Row#
,Guid
,Version
,Title
,IsLatestVersion
from @SWs

但这给了我一个结果:

这几乎是正确的,但是使用guid2的任务没有正确编号。因为它没有草稿,也有多个版本,所以我不能让版本2先出现。如果您对此问题有任何帮助,我们将不胜感激。

8xiog9wr

8xiog9wr1#

我想您需要一个条件排序作为第一个标准来放置 version0 首先,然后对 version 继续 islatestversion :

row_number() over(
    partition by guid 
    order by 
        case when version = 0 then 0 else 1 end, 
        version desc,
        islatestversion desc
) as row#

db小提琴演示:

row# | Guid  | Version | Title                | IsLatestVersion
---: | :---- | ------: | :------------------- | :--------------
   1 | guid1 |       0 | StandardWork1(Draft) | False          
   2 | guid1 |       1 | StandardWork1        | True           
   1 | guid2 |       2 | StandardWork2.2      | True           
   2 | guid2 |       1 | StandardWork2        | False          
   1 | guid3 |       1 | StandardWork3        | True           
   1 | guid4 |       1 | StandardWork4        | True           
   1 | guid5 |       0 | StandardWork5(Draft) | False

相关问题