繁体   English   中英

SQL:如何 select 列值基于 window 帧(包括前面的行)中的聚合最小值/最大值

[英]SQL: How to select a column-value based on an aggregate min/max value in a window frame (including preceding rows)

我有下表:

| Date     | Value   | Name | AnticipatedValue |
| -------- | ------- | ---- | ---------------- |
| 27.11.20 | 639.600 | col1 |                  |
| 30.11.20 | 638.300 | col2 |                  |
| 01.12.20 | 638.000 | col3 | col1             |
| 02.12.20 | 642.600 | col4 | col1             |
| 03.12.20 | 646.200 | col5 | col1             |
| 04.12.20 | 651.900 | col6 | col4             |
| 07.12.20 | 651.800 | col7 | col4             |
| 08.12.20 | 643.800 | col8 | col6             |
| 09.12.20 | 654.250 | col9 | col6             |

我想要在前2 行和第 5 行之间具有最大值的行中的名称 AnticipatedValue列显示了我想要的结果。

我目前正在使用 window function 来获取该示例中的最大值,但是我缺少获取该最大值的相应名称的方法。 我当前的代码如下所示:

MAX(value) OVER (ORDER BY date ROWS BETWEEN 5 PRECEDING AND 2 PRECEDING)

我认为如果我能够在 window 框架本身内部执行另一个 ORDER BY ,那么对我最有帮助的是。 然后我可以使用按值降序的顺序并取我得到的名字。 然而,这在 sql 的聚合函数中是不可能的/实现的。

同样使用子查询来获取相应的名称是相当困难的 imo,因为我仍然必须在子查询中应用 window 帧(即在第 2 行和第 5 行之前)。

我正在使用 Postgres 12.6。

我非常感谢有关此 sql 谜语的任何帮助。 我觉得我离解决方案不远,但找不到任何优雅的方法来做到这一点。

更新我采用了 Gordon Linoff 的解决方案并通过使用左连接并添加限制 1 来调整它以获得我想要的上表:

select t.*, t2.*
from t left join lateral
     (select t2.name, t2.value
      from (select t2.name, t2.value
            from t t2
            where t2.date < t.date
            order by t2.date desc
            offset 1 fetch first 4 rows only
           ) t2
       order by value desc
      limit 1
      ) t2 ON true;

您可以使用横向连接:

select t.*, t2.*
from t cross join lateral
     (select t2.*
      from (select t2.name, t2.value
            from t t2
            where t2.date < t.date
            order by t2.date desc
            offset 1 fetch first 4 rows only
           ) t2
       order by value desc
      ) t2;

  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM