我找不到我的问题的答案,因为与此类似的所有问题都没有在最大值中使用可为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
。当我在ContractId
和SELECT
中添加GROUP BY
时,我又得到了所有版本。
结果应为:
| ContractId |
+------------+
| 4 |
| 6 |
| 7 |
答案 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;