【发布时间】:2018-09-28 10:29:50
【问题描述】:
环境:MS SQL Server 2016。
我有一个表格,其中包含(Jasper 报告)这样的布局表示(为简洁起见,仅显示相关字段):
ID Name Key Version
1 CoverLetter <guid1> 1.00.00
2 Contract <guid2> 1.00.00
3 CoverLetter <guid1> 1.00.01
目标:
我需要一个额外的计算字段,根据该字段设置为 true 或 false 记录是否是任何给定 Layout 的最高版本(相同的布局但不同的版本有相同的 key,不同的布局有不同的 key)。
像这样:
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
只显示每个 Layout 的最高版本的 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。
我已经做过的事情: 搜索了谷歌和 SO,但没有找到任何类似的东西我可以转换成我需要的东西。
【问题讨论】:
-
CASE WHEN ROW_NUMBER() OVER (PARTITION BY Key ORDER BY Version DESC) = 1 THEN 1 ELSE 0 END。需要一些程序集(ROW_NUMBER()可能不允许直接在CASE中,并且需要子查询/CTE)。使用MAX的解决方案也是可能的,并且可能会或可能不会更有效。
标签: sql-server sql-server-2016 calculated-columns