sql - 在 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,但我正在尝试找到一个更优雅的解决方案。有什么想法吗?
谢谢!
解决方案
我认为最简单的方法可能是横向连接和窗口函数:
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
推荐阅读
- playframework - Scala Play 2.7 在 75 秒后重新执行动作的主体
- javascript - 从 env 变量中读取跟踪 ID 并在 HTML 文件的 head 部分的 GA 脚本标记中使用它
- c# - 处理嵌套属性值
- openlayers - 如何提高 getFeaturesAtPixel 的性能?
- android - 登录到 ASP.NET Core 应用程序在 Xamarin.Forms 应用程序中使用 .NET HttpClient 的 Android 真实设备上不起作用
- ruby - 在 Ruby 中,为什么可变性意味着解释器不能使用同一个对象来表示两个相同的字符串文字?
- c# - C#串口数据解读
- c++ - 是否存在将 long 转换为指针有效的情况
- java - 多线程只写一个输出流和数据丢失
- angular - 使用访问父级中的子级数据