将计算字段/计算列中版本号最高的记录标记为“ true”,其余为false

时间:2018-09-28 10:29:51

标签: sql-server sql-server-2016 calculated-columns

环境: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。

我已经做了: 搜索了谷歌和谷歌,但没有找到任何类似的东西,我可以将其转换为我需要的东西。

3 个答案:

答案 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中,没有IsLatesttrue,可以使用false数据类型,它有两个值(就像布尔值一样):1和0。

尝试此查询:

BIT