gpt4 book ai didi

SQL 窗口函数 - 自上次 Max 以来的行数

转载 作者:行者123 更新时间:2023-12-02 00:51:31 24 4
gpt4 key购买 nike

我正在尝试创建一个 SQL 查询,它将提取自 Windows 函数中最后一个最大值以来的行数超过最后 5 行。在下面的示例中,它将为第 8 行返回 2。最大值为 12,即距第 8 行 2 行。

对于第 6 行,它将返回 5,因为 7 的最大值在 5 行之外。

|ID  | Date       | Amount  
| 1 | 1/1/2019 | 7
| 2 | 1/2/2019 | 3
| 3 | 1/3/2019 | 4
| 4 | 1/4/2019 | 1
| 5 | 1/5/2019 | 1
| 6 | 1/6/2019 | 12
| 7 | 1/7/2019 | 2
| 8 | 1/8/2019 | 4

我尝试了以下方法:

SELECT ID, date, MAX(amount) 
OVER (ORDER BY date ASC ROWS 5 PRECEDING) mymax
FROM tbl

这让我达到了最大值,但我无法有效地确定它有多少行。我能够在 SELECT 中使用多个变量来关闭,但这似乎没有效率或可扩展性。

最佳答案

您可以计算累积最大值,然后对其使用 row_number()

所以:

select t.*,
row_number() over (partition by running_max order by date) as rows_since_last_max
from (select t.*,
max(amount) over (order by date rows between 5 preceding and current row) as running_max
from tbl t
) t;

我认为这适用于您的样本数据。如果您有重复项,它可能不起作用。

在这种情况下,您可以使用日期算法:

select t.*,
datediff(day,
max(date) over (partition by running_max order by date),
date
) as days_since_most_recent_max5
from (select t.*,
max(amount) over (order by date rows between 5 preceding and current row) as running_max
from tbl t
) t;

编辑:

这是一个使用行号的例子:

select t.*,
(seqnum - max(case when amount = running_amount then seqnum end) over (partition by running_max order by date)) as rows_since_most_recent_max5
from (select t.*,
max(amount) over (order by date rows between 5 preceding and current row) as running_max,
row_number() over (order by date) as seqnum
from tbl t
) t;

关于SQL 窗口函数 - 自上次 Max 以来的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57228327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com