如何用SQL窗口函数对比影片时长与所有影片的最长时长?
解决方案
其实窗口函数刚好能优雅解决这个需求,用MAX()窗口函数就能让每一行都带上全局最长时长,对比起来很直观。
实现SQL
SELECT movie, runtime, MAX(runtime) OVER () AS max_runtime, -- 可以直接计算差值,让对比更直观 runtime - MAX(runtime) OVER () AS runtime_diff_from_max FROM movie;
查询结果
| movie | runtime | max_runtime | runtime_diff_from_max |
|---|---|---|---|
| Titanic | 240 | 300 | -60 |
| Avengers | 300 | 300 | 0 |
说明
MAX(runtime) OVER ()里的OVER()没有指定分区,会计算整个表的最长时长,然后把这个值附加到每一行上,完美满足"每部影片和全局最长时长对比"的需求。- 你提到普通查询解决不了?其实用子查询也能实现:
SELECT movie, runtime, (SELECT MAX(runtime) FROM movie) AS max_runtime FROM movie,但窗口函数的写法更简洁,后续如果要扩展需求(比如按年份分组求该年最长时长),只需要在OVER()里加PARTITION BY year就行,灵活性更高。
内容的提问来源于stack exchange,提问作者Atif
相关产品推荐
相关产品推荐

