首页 > 解决方案 > 在 SQL Server 的有界窗口内查找第二大值

问题描述

SQL 问题 - 有谁知道从有界窗口中选择第二高值的方法?我有一组地区/产品/周的定价数据。我需要为每一行创建一个新列,显示过去 13 周内为给定地理位置/产品提供的第二高价格。我基本上需要在 ADW 中找到一个 NTH_ROW () 等价物。理想情况下,该解决方案类似于以下内容,但确定第二高的价格而不是最高价格(除非在 13 周期间仅注册了一周的定价,在这种情况下它将填充该价格):


    comparison_price = MAX(price) over (
                          PARTITION BY geography, product
                          ORDER BY week
                          ROWS BETWEEN 12 PRECEDING AND CURRENT ROW

此图像显示了我希望为特定产品/地理位置每周填充的 compare_price 列的示例:

示例表

我尝试使用 NROW() 解决方法,但收到一条错误消息,提示窗口需要无界。我也考虑过创建一个单独的 CTE,但我正在尝试找到一个更优雅的解决方案。有什么想法吗?

谢谢!

标签: sqlsql-servermaxgreatest-n-per-groupwindow-functions

解决方案


我认为最简单的方法可能是横向连接和窗口函数:

select t.*, coalesce(x.price, t.price) as comparison_price
from mytable t
outer apply (
    select *
    from (
        select t1.*,
            row_number() over(partition by geography, product order by price desc) rn
        from mytable t1
        where t1.geography = t.geography and t1.product = t.product and t1.week <= t.week
        order by t1.week
        offset 0 rows fetch first 13 rows only
    ) x
    where x.rn = 2
) x

推荐阅读