sql-server - T-SQL 中多个字段中的相同窗口函数 : optimization?

标签 sql-server t-sql query-optimization ranking

我在 T-SQL SELECT 的多个 WHEN 中使用完全相同的窗口函数。

SELECT 
    ModuleUsage = CASE
        WHEN Operation = 1 and OperationResult=1 and 1 != LAG(operation) OVER(
            PARTITION BY moduleid, clientname
            ORDER BY moduleid, clientname, timestamp, operation
        )
            THEN 1
        WHEN Operation = 2 and OperationResult=3 and 1 = LAG(operation) OVER(
            PARTITION BY moduleid, clientname
            ORDER BY moduleid, clientname, timestamp, operation
        )
            THEN -1
        ELSE 0
    END
    , *
FROM [dbo].[LicencesTracing]

是否评估了两次,或者查询优化器是否第二次重用结果? 提前致谢

最佳答案

我们可以像下面这样重写查询,以便只使用一次该函数吗?

       -- window function <> 1
SELECT CASE WHEN LAG(operation) OVER(PARTITION BY moduleid, clientname ORDER BY moduleid, clientname, timestamp, operation) <> 1

            THEN CASE WHEN Operation = 1 and OperationResult=1 THEN 1 ELSE 0 END

       -- window function = 1
       ELSE

            CASE WHEN Operation = 2 and OperationResult=3 THEN -1 ELSE 0 END
       END AS ModuleUsage
      ,*
FROM [dbo].[LicencesTracing];

我认为使用 IIF 会简化代码:

SELECT CASE WHEN LAG(operation) OVER(PARTITION BY moduleid, clientname ORDER BY moduleid, clientname, timestamp, operation) <> 1 
            THEN IIF(Operation = 1 and OperationResult=1, 1, 0)
            ELSE IIF(Operation = 2 and OperationResult=3, -1, 0)
       END AS ModuleUsage
      ,*
FROM [dbo].[LicencesTracing]; 

关于sql-server - T-SQL 中多个字段中的相同窗口函数 : optimization?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46687775/

相关文章:

sql-server - 删除并重新创建 SQL Server 临时表上的主键

sql - XML 解析错误 非法限定名称字符

mysql select * by index 很慢

sql-server - 在 Sql Geography 列或更简单的列中存储 Long/Lat?

sql - 指定外键是否使其成为索引?

sql-server - 无法将类型 'net.sourceforge.jtds.jdbc.ClobImpl' 的属性值转换为所需类型 'java.lang.String'

sql - 如何对列中包含可变数据的表进行数据透视表

sql - 当所有连接条件与 TSQL 匹配时,如何按特定顺序将 2 个表连接在一起

mysql - 查询 MySQL 中至少一个子项满足约束 1 并且所有子项满足约束 2 的所有行

SQLite连接优化