Есть несколько способов решить эту проблему. Один из них - сравнить одну и ту же подстроку RuleUID
со значением MAX
:
SELECT firstname, lastname, RuleUID
FROM employee
WHERE CAST(SUBSTRING(RuleUID,1,CHARINDEX('_',RuleUID)-1) AS INT) =
(SELECT MAX(CAST(SUBSTRING(RuleUID,1,CHARINDEX('_',RuleUID)-1) AS INT))
FROM employee)
Другой вариант - добавить часть _rule
значения обратно к значению MAX
и сравнить это напрямую. ,Это должно быть более эффективным, так как вы можете использовать индекс на RuleUID
:
SELECT firstname, lastname, RuleUID
FROM employee
WHERE RuleUID = (SELECT CONCAT(MAX(CAST(SUBSTRING(RuleUID,1,CHARINDEX('_',RuleUID)-1) AS INT)), '_rule')
FROM employee)
Если вы не хотите использовать подзапросы, вы можете использовать CTE
с любым из ROW_NUMBER()
:
WITH CTE AS (
SELECT firstname, lastname, RuleUID,
ROW_NUMBER() OVER (ORDER BY CAST(SUBSTRING(RuleUID,1,CHARINDEX('_',RuleUID)-1) AS INT) DESC) AS rn
FROM employee)
SELECT firstname, lastname, RuleUID
FROM CTE
WHERE rn = 1
или RANK()
:
WITH CTE AS (
SELECT firstname, lastname, RuleUID,
ROW_NUMBER() OVER (ORDER BY CAST(SUBSTRING(RuleUID,1,CHARINDEX('_',RuleUID)-1) AS INT) DESC) AS rn
FROM employee)
SELECT firstname, lastname, RuleUID
FROM CTE
WHERE rn = 1
Наконец, вы можете использовать простой запрос TOP
:
SELECT TOP 1 firstname
, lastname
, RuleUID
FROM employee
ORDER BY CAST(SUBSTRING(RuleUID,1,CHARINDEX('_',RuleUID)-1) AS INT) DESC
Во всех случаях вывод (для моегодемо) то же самое:
firstname lastname RuleUID
someone else 120_rule
демо на dbfiddle