2013-12-21 23 views
0

讓說我有一個user表和記錄是這樣的:數據排序和選擇最多的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

假設您的列格式在開始時始終具有相同的字符數量,您可以使用此查詢刪除前2個字符,並將剩餘數字轉換爲數字,以便在您的max查詢中獲得正確的行爲:

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 |約翰