我有一个包含列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,'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标准
答案 0 :(得分:1)
您需要将原始表与结果一起加入以获取所有列:
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)
答案 1 :(得分:1)
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
这样做的另一个好处是,如果您以后决定为每个文档检索最后两个修订版,那么您只需执行WHERE RANK <= 2
答案 2 :(得分:0)
你不应该这样做。但是mysql有bug,它允许你也可以使用其他列名。你可以简单地做ComDoc_Document。*(或只是*)(你不再需要documentmentid了)。但正如我所说,它应该不能像这样工作 - 如果你在同一个文档中的第二列值“A”,“B”,“C”怎么办?应返回哪个值?原则上你应该只能使用那些你通过分组或聚合功能的值(就像你使用MAX,MIN等一样)