首页 > 解决方案 > 带引用的 SQL MIN、MAX 窗口查询

问题描述

我有一个使用 min 和 max 窗口函数的报告中的工作查询,但我需要提取 min 和 max 的引用。这是主要查询:

SELECT 
    company, 
    countryname,
    dept,
    unit,
    score,
    MAX(score) OVER(PARTITION BY company) AS max_comp_score,
    --need reference countryname, dept, unit for this max score

    MIN(score) OVER(PARTITION BY company) AS min_comp_score,
    --need reference countryname, dept, unit for this min score

    AVG(score) OVER(PARTITION BY company) AS avg_comp_score

FROM 

tt.vw_Score_Report

该视图非常大(5 百万行),因此如果我对 min 和 max 进行子查询以从那里提取它们的引用,则需要很长时间才能检索它们。

将这些属性获取到查询的选项是什么?认为可能有一些优雅的方法来解决这个问题。

标签: sql-servertsql

解决方案


您可以使用 aCROSS APPLY来获取最小和最大行:

SELECT 
    company, 
    countryname,
    dept,
    unit,
    score,
    srmin.countryname,
    srmin.dept,
     ...
    srmax.countryname,
    srmax.dept,
    srmax.score,
    .....
    AVG(score) OVER(PARTITION BY company) AS avg_comp_score

FROM tt.vw_Score_Report sr
CROSS APPLY (   SELECT TOP 1 countryname, dept, unit ,score
                FROM tt.vw_Score_Report sr2
                WHERE sr2.company = sr.company
                ORDER BY score DESC
    ) srmax
CROSS APPLY (   SELECT TOP 1 countryname, dept, unit ,score
                FROM tt.vw_Score_Report sr3
                WHERE sr3.company = sr.company
                ORDER BY score ASC
    ) srmin

推荐阅读