2015-06-25 102 views
0

我想根据SQL Server 2008中特定列值的最大值来选择行。我需要根据最大版本选择书名和年份。如何根据特定列的最大值选择行?

当前表中的数据:

BookName Year Edition 
Latest Science 2013 1 
Latest Science 2014 2 
Latest Science 2015 3 
Easy Maths  2014 1 
Easy Maths  2015 2 
Magic vs Logic 2015 1 

输出应该是:

BookName Year Edition 
Latest Science 2015 3 
Easy Maths  2015 2 
Magic vs Logics 2015 1 

我试过,但它导致只有一个行整个表的

SELECT  Book, year, edition 
FROM   Book_info 
where edition=(select max(edition) from book_info) 

回答

0

你应该查找组有条款。

这是整个脚本根据您的要求,它返回您正在寻找的结果。

USE [Test] 

--table 

SET ANSI_NULLS ON 

GO 

SET QUOTED_IDENTIFIER ON 

GO 

SET ANSI_PADDING ON 

GO 

CREATE TABLE [dbo].[Book](

[Id] [int] IDENTITY(1,1) NOT NULL, 

[BookName] [varchar](50) NOT NULL, 

[Year] [int] NOT NULL, 

[Edition] [int] NOT NULL 

) ON [PRIMARY] 

GO 

SET ANSI_PADDING OFF 

GO 



USE [Test] 

GO 

--records 

INSERT INTO [dbo].[Book] 

([BookName] 

,[Year] 

,[Edition]) 

VALUES 

('Last Science', 2013 ,1), 

('Last Science', 2014 ,2), 

('Last Science', 2015 ,3), 

('Easy Maths', 2014 ,1), 

('Easy Maths', 2015 ,2), 

('Magic vs Logic', 2015 ,1) 

GO 

USE [Test] 

GO 

--query 

SELECT 

BookName, 

MAX([Year]) AS Year, 

MAX(Edition) AS Edition 

FROM dbo.Book 

GROUP BY 

BookName 

Order by MAX(Edition) DESC 
+0

感谢@ chdev77,按真是帮了我。 –

+0

但是我面临一个错误,如果我使用显示BookName的年份。 year在选择列表中是无效的,因为它不包含在聚合函数或GROUP BY子句中。在这里,我找到了我的问题的答案,但我想知道如何显示相应的一年, SELECT BookName,MAX(Edition)AS Edition FROM Book_info AS Book_info_1 GROUP BY BookName order by Edition –

+0

Thanks @ chdev77,Its works就像魅力一样,我想再多一次我不想显示年份的最大值,但我需要显示最大版本的相应年份。 –

1

我会做这种方式:

;WITH cte AS (
SELECT *, 
ROW_NUMBER() OVER (PARTITION BY BookName ORDER BY Edition DESC) AS rn 
FROM book_info 
) 
SELECT * FROM cte 
WHERE rn=1 
+0

'PARTITION BY'后不需要逗号:) –

+0

谢谢,我忘了(显然)。 :) –

+0

我有点困惑,你能解释一下代码吗?代码是否以分号开头? –

相关问题