创建SQL查询 - 具有不同的MSSQL

时间:2011-08-18 09:22:18

标签: 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,'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标准

3 个答案:

答案 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等一样)