如何选择所有PK(第1列),其中第3列的MAX(ISNULL(value,0))由第2列的值分组?

时间:2018-12-14 08:37:08

标签: sql-server tsql

我找不到我的问题的答案,因为与此类似的所有问题都没有在最大值中使用可为null的int并从中获得1列。

我的表格如下:

| ContractId | ContractNumber | ContractVersion |    
+------------+----------------+-----------------+    
|          1 |             11 |            NULL |  
|          2 |             11 |               1 |  
|          3 |             11 |               2 |  
|          4 |             11 |               3 | --get this one 
|          5 |             24 |            NULL |  
|          6 |             24 |               1 | --get this one 
|          7 |             75 |            NULL | --get this one 

第一个版本为NULL,随后的所有版本均以1开头的数字。

所以现在我只想获取最新合约的行(如行后面的注释所示)。

因此,对于每个ContractNumber,我想从最新的ContractId中选择ContractVersion

MAX()函数无法使用,因为它是可为null的int。

所以我当时想结合使用ISNULL(ContractVersion, 0)MAX()函数,但是我不知道怎么做。

我尝试了以下代码:

SELECT 
    ContractNumber,
    MAX(ISNULL(ContractVersion, 0))
FROM
    Contracts
GROUP BY 
    ContractNumber 

...返回了所有最新版本号和ContractNumber的组合,但是我需要ContractId。当我在ContractIdSELECT中添加GROUP BY时,我又得到了所有版本。

结果应为:

| ContractId |
+------------+
|          4 |
|          6 |
|          7 |

2 个答案:

答案 0 :(得分:2)

当您要基于最小/最大选择行时,它只是ROW_NUMBER()的简单应用程序:

declare @t table (ContractId int, ContractNumber int, ContractVersion int)
insert into @t(ContractId,ContractNumber,ContractVersion) values
(1,11,NULL ),
(2,11,   1 ),
(3,11,   2 ),
(4,11,   3 ),
(5,24,NULL ),
(6,24,   1 ),
(7,75,NULL )

;With Numbered as (
    select *,ROW_NUMBER() OVER (
             PARTITION BY ContractNumber
             order by ContractVersion desc) rn
    from @t
)
select
    *
from
    Numbered
where rn = 1

答案 1 :(得分:0)

这将起作用:

select ContractId,max(rank),ContractNumber from(select *,rank() over(partition by 
ContractVersion order by nvl(ContractVersion,0)) desc ) rank from tablename)  group by 
ContractId,max(rank),ContractNumber;