gpt4 book ai didi

SQL 服务器 : CROSS APPLY equivalent for ROW_NUMBER() query

转载 作者:行者123 更新时间:2023-12-04 15:53:47 25 4
gpt4 key购买 nike

我正在尝试寻找一种不同的方法来使用 CROSS APPLY 编写 ROW_NUMBER() 查询,以便比较性能。

在下面的简单示例中,创建了一个员工表,插入了一些测试数据,并使用带有 ROW_NUMBER() 窗口函数的 SELECT 来查找员工在任期最长的每个部门。

是否有另一种使用CROSS APPLY 编写SELECT 的方法?

CREATE TABLE [dbo].[tblEmployee]
(
[ID] [INT] NOT NULL,
[DeptID] [TINYINT] NOT NULL,
[EmpName] [VARCHAR](100) NOT NULL,
[Tenure] [TINYINT] NOT NULL,

CONSTRAINT [PK_tblEmployee]
PRIMARY KEY CLUSTERED ([ID] ASC)
) ON [PRIMARY]
GO

INSERT INTO dbo.tblEmployee (ID, DeptID, EmpName, Tenure)
VALUES ('1', '1', 'John', 2),
('2', '1', 'Mary', 5),
('3', '2', 'Joe', 3),
('4', '3', 'Bill', 10),
('5', '2', 'Marilynn', 9),
('6', '3', 'Sue', 7);

SELECT
EmpName, DeptID, Tenure
FROM
(SELECT
EmpName, DeptID, Tenure,
ROW_NUMBER() OVER(PARTITION BY DeptID ORDER BY Tenure DESC) TenureRank
FROM
tblEmployee) e
WHERE
e.TenureRank = 1
ORDER BY
DeptID

编辑:我宁愿不使用 CTE 作为 SELECT

的一部分

最佳答案

cross apply 等价物是:

select e.*, a.seqnum
from tblEmployee e cross apply
(select count(*) as seqnum
from tblEmployee e2
where e2.deptid = e.deptid and
(e2.tenure > e.tenure or
e2.tenure = e.tenure and e2.id >= e.id
)
) a;

你不会想这样做,因为它比 row_number() 效率低得多。请注意使用 id 进行比较以确保唯一编号。

关于SQL 服务器 : CROSS APPLY equivalent for ROW_NUMBER() query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52763875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com