My-Sql 中的窗口化功能无法按预期工作

Posted

技术标签:

【中文标题】My-Sql 中的窗口化功能无法按预期工作【英文标题】:Windowing function in My-Sql does not work as expected 【发布时间】:2021-03-18 02:32:44 【问题描述】:

我在一个 my-sql 表中有三列:Id、name 和 mark。所有行彼此不同。 我使用下面的 sql 语句。在窗口函数内部,我不在两个 SQL 语句中使用 order by。我只有分区和范围框架。

理想情况下,它们应该在窗口函数的派生列下给出相同的结果;但是第一个总是在窗口下给出最大标记;而第二个比较前一行和当前行+1并给出预期结果。第一个真的很奇怪,即使我给出了无限的前行和当前行;实际上,它考虑的是整个窗口而不是给定的框架。

有人可以帮忙吗。

声明 1:

select  *
       ,max(mark) over( partition by name   rows between unbounded preceding and current row) as w_f 
from  ( select * from student order by name, mark asc) a

声明 2:

select  *
       ,max(mark) over( partition by name   rows between 1 preceding and 1 following) as w_f 
from  ( select * from student order by name, mark asc) a

【问题讨论】:

【参考方案1】:

没有order by 子句的行(或范围)框架没有意义:如果您不指定应使用哪些列进行排序,如何定义哪一行在前或后。

还请注意,order by 子句的子查询可能不会按照您的预期进行。不能保证内部排序会传播到外部查询。

在没有样本数据和预期结果的情况下,您实际上想要做什么有点不清楚。假设您有排序列 id,第一个查询将表述为:

select s.*,
    max(mark) over(partition by name rows order by id) as w_f 
from student
order by name, id

rows between unbounded preceding and current row 是默认窗口规范(实际上是range between ...,如果您有唯一的排序键,则等效)。

第二个查询是这样的:

select s.*,
    max(mark) over(partition by name rows order by id rows between 1 preceding and 1 following) as w_f 
from student
order by name, id

【讨论】:

以上是关于My-Sql 中的窗口化功能无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

WS_EX_TOOLWINDOW 工具窗口无法按预期工作

WebDriverWait 未按预期工作

Apache Beam:如果前面有状态转换,WriteToBigQuery 将不起作用,除非应用重新窗口化

MFC(C++)CDialog DoModal()没有按预期工作

聚合窗口中的过滤器子句未按预期丢弃行

Selenium 超时异常未按预期工作