计算每个时间点迄今为止看到的最大值

acc*_*yst 4 sql-server-2008-r2

我试图计算的内容有点难以描述,所以请耐心等待...

我有一张表,上面有产品编号,以及 4 年内每周每种产品的价格。价格可以在几周之间上涨或下跌。对于每个日期,我试图计算每个产品在那个时间点之前的最高价格。

在下面的示例表中,第三列(价格)是我拥有的数据;第四列(最大价格坑)是我试图计算的。- 编辑:需要明确的是,此列尚不存在!

例如,在 2012 年 15 月 1 日,产品 001 的最高价格为 50,尽管在接下来的一周它上升到 60(这是整个时期的最高价格)。

我想我可能需要使用某种循环,但我真的不知道从哪里开始。我对 SQL 的基础知识有很好的掌握,但是当它涉及到窗口函数和进一步时,我有点模糊。我在谷歌上搜索了很多问题,但找不到任何指针。

任何人都可以帮忙吗?如果您需要我澄清我的要求,请告诉我!

产品 | 日期 | 价格 | Max Price PIT(这一栏是我要计算的)
001 01/01/2012 25 25
001 08/01/2012 50 50
001 15/01/2012 35 50
001 22/01/2012 60 60
001 29/01/2012 50 60
001 05/02/2012 15 60
002 01/01/2012 18 18
002 08/01/2012 7 18
002 15/01/2012 10 18
002 22/01/2012 20 20
002 29/01/2012 30 30
002 05/02/2012 25 30

谢谢!

ps 表是 19391864 行。

Ser*_*ton 7

如果您需要滚动最大值,则可以同时使用CROSS APPLYLEFT JOIN,这是CROSS APPLY版本

SELECT Product, Date, Price, b.[Max Price PIT]
FROM   Table1 a
       CROSS APPLY (SELECT MAX(Price) [Max Price PIT]
                    FROM   Table1 b
                    WHERE  a.Product = b.Product
                      AND  a.Date >= b.Date) b
Run Code Online (Sandbox Code Playgroud)

SQLFiddle demo

使用 SQLServer 2012 或更高版本,可以使用 newROWS子句获得相同的效果

SELECT Product, Date, Price
     , MAX(Price) OVER (PARTITION BY Product ORDER BY [Date] 
                        ROWS UNBOUNDED PRECEDING) [Max Price PIT]
FROM   Table1
Run Code Online (Sandbox Code Playgroud)

关键是获取当前组之前的所有行并仅对它们应用统计函数,有时这种类型的表示称为“滚动”,例如滚动总和/总计,如果您获得现金的总价值,直到当前行。