环境:MS SQL Server 2016。
我有一个表,其中包含这样的(Jasper Reports)布局表示形式(为简洁起见,仅显示相关字段):
ID Name Key Version
1 CoverLetter <guid1> 1.00.00
2 Contract <guid2> 1.00.00
3 CoverLetter <guid1> 1.00.01
目标:
我需要一个附加的计算字段,根据该字段设置为true或false 记录是否为任何给定布局的最高版本(相同布局,但不同版本具有相同的键,不同布局具有不同的键)。
赞:
ID: Name: Key: Version: isHighestVersion: (calculated field)
1 CoverLetter <guid1> 1.00.00 false
2 Contract <guid2> 1.00.00 true
3 CoverLetter <guid1> 1.00.01 true
仅显示每个布局的最高版本的SQL查询是这样的:
( SELECT TACMasterlayouts.*
FROM
(SELECT
TACMasterLayoutKey, MAX(TACMasterLayoutVersion) as TACMasterLayoutVersion
FROM
TACMasterlayouts
GROUP BY
TACMasterLayoutKey) AS latest_TACMasterLayouts
INNER JOIN
TACMasterlayouts
ON
TACMasterlayouts.TACMasterLayoutKey = latest_TACMasterLayouts.TACMasterLayoutKey AND
TACMasterlayouts.TACMasterLayoutVersion = latest_TACMasterLayouts.TACMasterLayoutVersion
)
但是我需要所有记录-每个键的版本号最高的记录都标记为true,其余的记录为false。
我已经做了: 搜索了谷歌和谷歌,但没有找到任何类似的东西,我可以将其转换为我需要的东西。
答案 0 :(得分:0)
只需将您的内联接更改为左外联接
并在您的案例中使用一个案例 选择 EG
CASE WHEN latest_TACMasterLayouts.TACMasterLayoutKey IS NOT NULL THEN 1 ELSE 0 END as isHighestVersion
答案 1 :(得分:0)
谢谢约翰, 这为我指明了正确的方向。
它必须是正确的外部联接-否则,仅显示具有最高版本的记录。
完整的工作代码供您参考:
{{1}}
答案 2 :(得分:0)
您需要进行一些解析才能获得所需的结果。
首先,您将版本号分成单独的int,然后根据它们分配row_number
,然后根据行号,将1-true或0-false放在额外的列中,我将其称为{ {1}}。
在SQL Server中,没有IsLatest
或true
,可以使用false
数据类型,它有两个值(就像布尔值一样):1和0。
尝试此查询:
BIT