2015-06-25 2 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. год является недопустимым в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY. Здесь я нашел ответ на мой вопрос, но я хочу знать, как отобразить соответствующий год, ВЫБРАТЬ BookName, MAX (Edition) AS Edition, ОТ Book_info AS Book_info_1 GROUP BY BookName порядке издания –

+0

Спасибо @ chdev77, его работы как шарм, я хочу еще одного, что я не хочу показывать максимум года, но мне нужно показать соответствующий год максимальной версии. –

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

Я немного смущен, не могли бы вы объяснить код? Код начинается с точки с запятой? –

Смежные вопросы