如何将此(MySQL 查询)转换为 SQL Server?
或者如何在我在查询中使用 where 时获得不改变的排名值:
SELECT id,
name,
score,
FIND_IN_SET( score, (SELECT GROUP_CONCAT( DISTINCT score
ORDER BY score DESC ) FROM scores)
) AS rank
FROM scores WHERE name = A;
Run Code Online (Sandbox Code Playgroud)
无需复杂的-和昂贵-FIND_IN_SET()和GROUP_CONCAT()解决方案。您只需要以下DENSE_RANK()功能:
SELECT
id, name, score,
DENSE_RANK() OVER (ORDER BY score DESC) AS rank
FROM scores ;
Run Code Online (Sandbox Code Playgroud)
如果你想添加一个WHERE子句,比如说WHERE name = 'C'并且仍然获得排名 - 在表的所有行中 - 你可以使用 CTE 或派生表:
-- derived table
SELECT d.*
FROM
(
SELECT
id, name, score,
DENSE_RANK() OVER (ORDER BY score DESC) AS rank
FROM scores
) AS d
WHERE d.name = 'C' ; -- arbitrary `WHERE`
-- CTE
WITH d AS
(
SELECT
id, name, score,
DENSE_RANK() OVER (ORDER BY score DESC) AS rank
FROM scores
)
SELECT d.*
FROM d
WHERE d.name = 'C' ; -- arbitrary `WHERE`
Run Code Online (Sandbox Code Playgroud)