SQL Server SQL选择具有最高版本的行

o75abkj4  于 2023-02-15  发布在  其他
关注(0)|答案(3)|浏览(149)

我正在尝试查询下表:
| 识别号|同意书标题|同意标识符|版本|显示顺序|
| - ------|- ------|- ------|- ------|- ------|
| 1个|脚注标题|足1|1个|1个|
| 第二章|脚注标题2|足1|第二章|第二章|
| 三个|条形标题|棒1|1个|三个|
| 四个|条形标题2|棒1|第二章|四个|
我的表包含具有唯一ConsentTemplateIdentifier的条目。我希望仅返回具有该特定唯一标识符的最高版本号的行...
| 识别号|同意书标题|同意标识符|版本|显示顺序|
| - ------|- ------|- ------|- ------|- ------|
| 第二章|脚注标题2|足1|第二章|第二章|
| 四个|条形标题2|棒1|第二章|四个|
我当前的查询似乎不起作用。它告诉我:
选择列表中的列“ConsentTemplate.ID”无效,因为聚合函数或GROUP BY子句中都不包含该列

Select Distinct ID,ConsentTitle, DisplayOrder,  ConsentTemplateIdentifier, MAX(Version) as Version
from FooDocs
group by ConsentTemplateIdentifier

如何明确地选择具有最高版本号的行,这些行是按照其显示顺序排序的各个ConsentTemplateIdentifier的版本号?
任何帮助都将不胜感激。我正在使用SQL Server。

8fsztsew

8fsztsew1#

您可以使用CROSS APPLY执行此操作。

SELECT DISTINCT ca.*
FROM FooDocs fd
CROSS APPLY (SELECT TOP 1 *
             FROM FooDocs
             WHERE ConsentIdentifier = fd.ConsentIdentifier
             ORDER BY Version DESC) ca

如果您的唯一标识符有自己的表。

SELECT ca.*
FROM ConsentTable ct
CROSS APPLY (SELECT TOP 1 *
             FROM FooDocs
             WHERE ConsentIdentifier = ct.Identifier
             ORDER BY Version DESC) ca
nhaq1z21

nhaq1z212#

使用CROSS APPLY可以工作,但是可以有效地为表中的每一行调用子查询,然后使用DISTINCT消除重复结果,从而产生半笛卡尔积/三角形连接。
通常,只使用ROW_NUMBER()并避免所有的隐式连接会更高效...

WITH
  sorted_by_version AS
(
  SELECT
    *,
   ROW_NUMBER()
     OVER (
       PARTITION BY ConsentTemplateIdentifier
           ORDER BY version DESC
     )
       AS version_ordinal
  FROM
    ConsentTemplates
)
SELECT
  *
FROM
  sorted_by_version
WHERE
  version_ordinal = 1
ORDER BY
  DisplayOrder
cdmah0mi

cdmah0mi3#

对Derrick的答案稍作修改后,我就能够使用CROSS APPLY以我希望看到的方式返回数据

SELECT DISTINCT ca.*
FROM ConsentTemplates fd
CROSS APPLY (SELECT TOP 1 *
             FROM ConsentTemplates
             WHERE ConsentTemplateIdentifier = fd.ConsentTemplateIdentifier
             ORDER BY Version DESC) ca
             order by DisplayOrder

相关问题