参考答案:task05

5.1

按照 product_id 升序排列,计算出截至当前行的最高 sale_price

5.2

如下两种方法都可以实现:

-- ①regist_date为NULL时,显示“1年1月1日”。
SELECT regist_date, product_name, sale_price,
       SUM(sale_price) OVER (ORDER BY COALESCE(regist_date, CAST('0001-01-01' AS DATE))) AS current_sum_price
  FROM Product;

-- ②regist_date为NULL时,将该记录放在最前显示。
SELECT regist_date, product_name, sale_price,
       SUM(sale_price) OVER (ORDER BY regist_date NULLS FIRST) AS current_sum_price
  FROM Product;

5.3

①:
窗口函数不指定 PARTITION BY 就是针对排序列进行全局排序。
②:
本质上是因为 SQL 语句的执行顺序。
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
如果在 WHERE, GROUP BY, HAVING 使用了窗口函数,就是说提前进行了一次排序,排序之后再去除记录、汇总、汇总过滤,第一次排序结果就是错误的,没有实际意义。而 ORDER BY 语句执行顺序在 SELECT 语句之后,自然是可以使用的。