如何使用 SQL UPDATE 语句设置每组的排名?

yam*_*asa 2 sql-server t-sql rank

请先参考表结构: 在此处输入图片说明

现在您可以看到有一个独特的约束,包括manager_code, archive_year and archive_day_of_year.

我需要对每个组的经理进行排名,这些组的成员具有相同的 branch_code、年份和年份。这里branch_code代表部门代码。

我试过这个: 查询以获取排名 在一组中排名结果

我可以RANK()在 SQL Server 上使用正确的等级编号,但我不知道如何使用UPDATEtable 上的语句将正确的等级设置回 rank_in_department 列open_account_by_manager_per_day

你知道如何做到这一点吗?

Jul*_*eur 6

CTE:

您可以嵌入你SELECTRANK()成CTE,然后UPDATE在CTE。

WITH cte AS
(
    SELECT *, r = RANK() OVER(PARTITION BY archive_day, archive_year, branch_code ORDER BY open_count)
    FROM @data
)
UPDATE c 
SET rank_in_department = r 
FROM cte c;
Run Code Online (Sandbox Code Playgroud)

不要忘记;CTE 语句前一行末尾的终止符。

子查询:

您还可以JOIN在子查询中使用预期的RANK.

UPDATE d SET rank_in_department = r.r
FROM @data d
INNER JOIN (
    SELECT id
        , r = RANK() OVER(PARTITION BY archive_day, archive_year, branch_code ORDER BY open_count) 
    FROM @data
) r ON d.id = r.id
Run Code Online (Sandbox Code Playgroud)

此查询需要Id在子查询和JOIN. 它用于唯一标识每一行并将JOIN其标识到表中。从您的示例图片中的数据来看,这似乎是manager_code+, archive_year, archive_day_of_year

使用的样本数据:

这使用此示例数据为您提供了 2 个正确的语法。查询必须适应您的真实表。

DECLARE @data TABLE(id int identity(0, 1), archive_year int, archive_day int, branch_code nvarchar(5), rank_in_department int, open_count int)
INSERT INTO @data(archive_day, archive_year, branch_code, open_count) VALUES
    (2016, 1, 'X', 5)
    , (2016, 1, 'X', 15)
    , (2016, 1, 'X', 52)
    , (2016, 1, 'X', 36)
    , (2016, 1, 'X', 55)
    , (2016, 1, 'Y', 65)
    , (2016, 1, 'Y', 85)
    , (2016, 1, 'Y', 42)
    , (2016, 1, 'Y', 96)
    , (2016, 1, 'Y', 15);

SELECT *
    , r = RANK() OVER(PARTITION BY archive_day, archive_year, branch_code ORDER BY open_count)
FROM @data;
Run Code Online (Sandbox Code Playgroud)