2016-08-02 53 views
1

假设我有一张如下所示的表格;SQL服务器 - 将搜索限制在列中的最大值

version_number ID Value 
1     33 Foo 
2     33 Bar 
1     37 Foo 

如果ID是33并且只能从最大版本号中选择,我将如何从表中返回值字段? (在这种情况下,2)

类似;

SELECT Value FROM Table WHERE ID = 33 and MAX(version_number) 

编辑:两个答案下面的工作。我要和Tim Schmelter的答案一起,因为我认为它更优雅一些,但我已经把它们都投了票。谢谢你们:)

回答

3

在sql-server中,您可以使用排名功能,如ROW_NUMBER,f.e.与CTE:

WITH CTE AS 
(
    SELECT t.*, rn = Row_Number() Over (Partition By ID Order By version_number Desc) 
    FROM dbo.TableName t 
) 
Select Value From CTE 
WHERE ID = 33 
    AND rn = 1 
+0

,如果我想指定version_number,但我需要它,所以它符合MAX对于指定值的任何值。因此,例如,搜索ID 33会得到v​​ersion_number 2的那一行,但如果有意义,搜索ID 37会得到version_number 1的那一行? –

+0

@RyanHargreaves:它的工作方式。它将总是返回属于每个ID的最大版本号的行(因为“通过ID分区”)。如果您希望将版本号的最小版本更改为version_number Asc。 –

+0

对不起,你说的是正确的,我忘了订购我的Desc。谢谢 :) –

1

您可以使用子查询为此:通过得到过滤后的数据

SELECT Value FROM 
(SELECT TOP 1 * 
    FROM Table 
    WHERE ID = 33 
    ORDER BY version_number 
) as t 

也就是说,开始,然后只打印所需的列。

+0

我想返回的值,而不是版本号 –

+0

@RyanHargreaves哦,我明白了。检查我的更新回答 – fedorqui

+0

当我翻译LIMIT关键字时出现语法错误。这是在SQL服务器上吗? –