2016-09-22 3 views
1

У меня есть таблица 'TEST', как показано нижеSQL запросов к группе текста на основе числового столбца

Number | Seq | Name 
-------+-------+------ 
123 | 1 | Hello 
123 | 2 | Hi 
123 | 3 | Greetings 
234 | 1 | Goodbye 
234 | 2 | Bye 

Я хочу написать запрос, чтобы сгруппировать таблицу «Номер» и выберите строки с максимальным порядковый номер (MAX (Seq)). Выходной сигнал запроса будет

Number | Seq | Name 
-------+-------+------ 
123 | 3 | Greetings 
234 | 2 | Bye 

Как это сделать?

EDIT: TEST - фактически таблица, которая является результатом длинного запроса (объединения нескольких таблиц), который я уже написал. У меня уже есть оператор (SELECT ...), чтобы получить нужные мне значения. Есть ли способ удалить повторяющиеся строки (с тем же «числом», как показано выше) и выбрать только тот, который имеет максимальное значение «Seq». Я на Microsoft SQL Server 2008 (SP2)

Я надеялся, что там будет путь для достижения этой цели путем

SELECT * FROM (SELECT ...) TEST <condition to group>

+0

Не могли бы вы рассказать о своем запросе, а часть yu застряла? – zee

+0

Что должно произойти там, где есть связи (как, очевидно, в ваших выборках)? Выберите один случайным образом? Это похоже на то, что произошло в вашем примере вывода (или, возможно, вы выбрали по алфавиту?) – mathguy

+0

@ z_- Я отредактировал вопрос – woodhead92

ответ

1

Вы можете использовать отборный выигрыш в пункте

select * from test 
where (number, count) in (select number, max(count) from test group by Number) 
+0

Я отредактировал свой вопрос в соответствии с моим текущим сценарием. Я попробовал это, выполнив «SELECT * FROM (SELECT ...) TEST WHERE Seq in (SELECT MAX (Seq) FROM TEST GROUP BY Number)» и столкнулся с «Недопустимым именем объекта» TEST ». ошибка. – woodhead92

0

Другой вариант - использовать оконную функцию ROW_NUMBER() с разделом на номер:

With Cte As 
(
    Select *, 
      Row_Number() Over (Partition By Number Order By Count Desc) RN 
    From TEST 
) 
Select Number, Count, Name 
From Cte 
Where RN = 1 
1
SELECT * 
    FROM (SELECT test.*, MAX (seq) OVER (PARTITION BY num) max_seq 
      FROM test) 
WHERE seq = max_seq 

Я изменил имя столбца из числа, потому что вы не можете использовать зарезервированное слово для имени столбца. Это почти то же самое, что и другие ответы, за исключением того, что он явно получает максимальный порядковый номер для каждого NUM.

0

Вы хотите использовать функцию ANALYTIC вместе с условным предложением, чтобы получить только те строки TEST, которые вы желаете.

WITH TEST as (
    ...your really complex query that generates TEST... 
) 
SELECT 
    Number, Seq, Name, 
    RANK() OVER (PARTITION By Number ORDER BY Seq DESC) AS aRank 
FROM Test 
WHERE aRank = 1 
; 

Это возвращает Number, Seq, Name для каждой группировки чисел, где Seq является максимальным. Да, он также возвращает столбец с именем aRank со всеми «1» в нем ... надеюсь, его можно игнорировать.

+0

Получение следующей ошибки: «Ошибка базы данных SQL Server: недопустимое имя столбца« aRank ». ' – woodhead92

+0

Упс, не заметил тег sql-сервера ... настраивая синтаксис SQL .... попробуйте включить синтаксис AS, как показано сейчас. – JasonInVegas

+0

Реализовано решение для самостоятельного присоединения, указанное в http://stackoverflow.com/questions/7745609/sql-select-only-rows-with-max-value-on-a-column, и это сделало трюк! Я также перечислил это решение в комментариях. – woodhead92

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