【发布时间】:2018-10-11 15:31:19
【问题描述】:
我正在尝试寻找一种不同的方法来使用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 以外的其他选项呢……还有什么可能更有效的吗?
-
这取决于。如果两个或多个员工的任期相同,您想怎么做?
-
@JoelCoehoorn 请假设不会有任何关系。我只是使用这个简单的示例来找出其他查询选项。在我的现实生活场景中,不会有任何联系。
标签: sql sql-server sql-server-2014