请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

select中的聚合函数和窗口函数的执行顺序

老师好,
这节里我用以下包含distinct和窗口函数的sql语句1也跑出了正确结果,但是如果把窗口函数提到前面(如sql语句2)就会报错,
sql语句1:
select DISTINCT(name) dname,
count(name) over (partition by 1)
from w_orders
where date_format(time,‘yyyy-MM’)=‘2021-09’;

sql语句2:
select name, count(name) over (partition by 1),
DISTINCT(name) dname
from w_orders
where date_format(time,‘yyyy-MM’)=‘2021-09’;
图片描述

比较好奇如果像这样select语句中同时出现聚合函数和窗口函数的执行顺序是怎样呢?

正在回答 回答被采纳积分+3

1回答

Michael_PK 2022-05-30 01:29:00

很好的问题。

你如果想了解sql的执行顺序,最简单的办法就是去查看这个sql的执行计划,在执行计划中会有详细的先后步骤

0 回复 有任何疑惑可以回复我~
  • 提问者 慕少7351152 #1
    嗯嗯了解啦~我研究了一下执行计划,目前的理解是:
    1. select DISTINCT(name) dname from w_orders 和select name from w_orders group by name; 的执行计划是完全一样的;
    2. 原问题中第一个sql分为了三步
    (1)TableScan,包含fliter和group by;
    (2)窗口函数;
    (3)Fetch;
    所以原sql的分步效果类似
    with tmp as
    (select DISTINCT(name) dname
    from w_orders
    where date_format(time,'yyyy-MM')='2021-09')
    select dname,
    count(dname) over (partition by 1)
    from tmp;
    
    至于原问题第2个sql会报错,猜测是在拆解执行计划时的第一步无法拆解,相当于拆解出以下的第1步,然后报错
    select name, DISTINCT(name) dname
    from w_orders
    where date_format(time,'yyyy-MM')='2021-09'
    回复 有任何疑惑可以回复我~ 2022-05-30 23:41:32
  • Michael_PK 回复 提问者 慕少7351152 #2
    第二个sql报错,语法上面就不支持吧?parseexception,在解析sql的时候就出问题了。
    distinct是多进一出,而窗口函数是每一行都有输出的
    回复 有任何疑惑可以回复我~ 2022-06-01 01:55:05
  • 提问者 慕少7351152 回复 Michael_PK #3
    嗯嗯是的,所以查执行计划的时候也报了错。。
    回复 有任何疑惑可以回复我~ 2022-06-02 11:04:25
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信