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

标签 sql sql-server sql-server-2014

我正在尝试寻找一种不同的方法来使用 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/

相关文章:

SQL Server 和嵌套的 SELECT : . .. ')' 附近的语法不正确?

sql - 内置函数将每个单词的首字母大写

sql-server - 重置SQL Server执行计划

sql - count(索引列)比count(*)快吗?

sql - Azure SQL 数据库与专用计算机上的 MS SQL Server

c# - Websocket 在 mssqlserver 中每分钟运行一次查询

mysql - 在 select 语句内的 Select 语句中找不到列

sql - TSQL - 如何找到日期之间缺失的月份?

sql-server - 在 Oracle/SqlServer/PgSql 表名开头使用@

sql - 在 SQL Server 查询结果中显示小计