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。
你知道如何做到这一点吗?
您可以嵌入你SELECT与RANK()成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)
| 归档时间: |
|
| 查看次数: |
12004 次 |
| 最近记录: |