2013-12-21 2 views
0

Пусть говорят, у меня есть user стол и запись выглядит так:Сортировка данных и выберите Max SQL Server

---------------------- 
| User ID | Username | 
---------------------- 
|US1  | Andy  | 
|US2  | Boston | 
|US3  | Charlie | 
|US4  | Donnie | 
|US5  | Elmo  | 
|US6  | Frank | 
|US7  | Garry | 
|US8  | Henry | 
|US9  | Ignatius | 
|US10  | John  | 

Что мне нужно

US10  | John 

Тогда я:

SELECT MAX (UserId) FROM User; 

Результаты были

US9  | Ignatius 

потому, что его заказали по строке буквально, так US10 не максимальная

Что я должен сделать, чтобы осуществить этот результат? Спасибо заранее.

ответ

0

Примечание: имейте в виду, что user является зарезервированным словом в SQL, так что следует использовать скобки вокруг этого [user]

Есть много вариантов:

1)

select top 1 Userid, 
CAST(SUBSTRING(UserId, PATINDEX('%[0-9]%', UserId), LEN(UserId)) AS INT) as Maxid, 
username 
from [user] 
Order By Maxid desc 

Выход:

Userid Maxid username 
============================= 
US10 10  John 

2)

SELECT TOP 1 * FROM [User] 
ORDER BY CAST(RIGHT(UserId,LEN(UserId)-2) AS INT) DESC 

Выход

userid username 
===================== 
US10 John 
0

Предполагая, что ваш формат столбца всегда имеет одинаковое количество символов в начале, вы можете использовать этот запрос для удаления первых двух символов и преобразования оставшихся в число, чтобы получить правильное поведение по вашему максимальному запросу:

SELECT MAX(CAST(SUBSTRING(`UserId` FROM 3) AS UNSIGNED)) FROM `User` ; 
1

Если вы устранили формат данных как чисел наконец, в строке, то вы можете использовать PATINDEX() функцию, чтобы получить число из строки, как

SELECT TOP 1 * FROM [User] 
ORDER BY CAST(SUBSTRING(UserId, PATINDEX('%[0-9]%', UserId), LEN(UserId)) AS INT) DESC; 

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

SQL Server 2008 - order by strings with number numerically

+0

'user' является зарезервированным словом в SQL, так что следует использовать скобки вокруг этого' [пользователь] ' –

+0

да, я знаю, это было просто например, по-прежнему я обновил свой ответ. –

0

Попробуйте этот запрос,

SELECT TOP 1 * FROM User ORDER BY CAST(RIGHT(UserId,LEN(UserId)-2) AS INT) DESC 

OP

US10 | Джон

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