创建sql查询-MSSQL,具有不同的
我有一个表,其中包含Id、DoucmentId、Name、Created、MinorVersion和MajorVersion列 使用示例数据:创建sql查询-MSSQL,具有不同的,sql,sql-server,Sql,Sql Server,我有一个表,其中包含Id、DoucmentId、Name、Created、MinorVersion和MajorVersion列 使用示例数据: GUID,1,'document1',GETDATE(),1,0) GUID,1,'document1',GETDATE(),2,0) GUID,1,'document1',GETDATE(),1,1) GUID,2,'document2',GETDATE(),1,0) 在查询中,我需要使用最高的主版本和次版本获得所有唯一性: GUID,1,'docu
GUID,1,'document1',GETDATE(),1,0)
GUID,1,'document1',GETDATE(),2,0)
GUID,1,'document1',GETDATE(),1,1)
GUID,2,'document2',GETDATE(),1,0)
在查询中,我需要使用最高的主版本和次版本获得所有唯一性:
GUID,1,'document1',GETDATE(),1,1)
GUID,2,'document2',GETDATE(),1,0)
我有这个查询,但我需要返回表中的所有列
SELECT DISTINCT
DocumentId,
MAX(MajorVersion),
MAX(MinorVersion)
FROM ComDoc_Document
GROUP BY(DocumentId)
这有什么诀窍吗
谢谢你的帮助
编辑:我的配置是MSSQL 2008R2 standart您应该无法执行此操作。但是mysql有一个bug,它允许您使用其他列名。您可以简单地执行ComDoc_Document.*(或只是*)(您不再需要documentid)。然而,正如我所说的,它不应该像这样工作——如果第二列中的值“A”、“B”、“C”对应于同一个documentid会怎么样?应该返回哪个值?原则上,您应该只能获取那些值,对于这些值,您可以使用group by或agregate函数(就像您使用MAX、MIN等函数一样)您需要将原始表与结果连接起来,以获得所有列:
SELECT t1.*
FROM ComDoc_Document AS t1
INNER JOIN (SELECT
DocumentId,
MAX(MajorVersion) AS MaxMajor,
MAX(MinorVersion) AS MaxMinor,
FROM ComDoc_Document
GROUP BY DocumentId) AS t2
ON (t1.DocumentID=t2.DocumentID AND t1.MajorVersion = t2.MaxMajor AND t1.MinorVersion = t2.MaxMinor)
这还有一个优点,如果您以后决定检索每个文档的最后两个修订版,您只需执行
中不需要区分的秩,如果我理解正确,group by子句就足够了。如果我使用标准group by SELECT。。。从ComDoc_Document GROUP BY(DocumentId)中,我得到的“Column”ComDoc_Document.Created在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句“ErrorThank for answer”中。“原则上,您应该只能获取那些值,对于这些值,您可以使用group by或agregate函数”。您是对的,但稍后我需要所有列数据,我无法单独加载这些数据…请参阅Cularis解决方案+我的注释谢谢您的回答。我第一次听说rank t-sql函数。不幸的是,这段代码报告我“关键字“WHERE”附近的语法不正确”。但是谢谢你的新消息information@Mennion哎呀。。。我在最后一个WHERE子句之前遗漏了一个“tmp”(您需要为嵌套查询提供一个名称)。修正了你不会失去MAX(主版本)和MAX(MinorVersion)吗?我认为您应该从中选择t1.*、MaxMajor、MaxMinor…它们与t1.MajorVersion和t1.MinorVersion相同,正如您在join子句中看到的那样。
SELECT Id,DocumentId,Name,Created,MinorVersion,MajorVersion
FROM
(
SELECT *
,RANK() OVER
(PARTITION BY DocumentID ORDER BY MajorVersion DESC, MinorVersion DESC) AS 'RANK'
FROM ComDoc_Document
) tmp
WHERE RANK = 1