Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建sql查询-MSSQL,具有不同的_Sql_Sql Server - Fatal编程技术网

创建sql查询-MSSQL,具有不同的

创建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

我有一个表,其中包含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 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