要按顺序取最小值需结合order by与rows between子句,语法为:min(column_name) over (order by order_column rows between unbounded preceding and current row),1. min(column_name)指定计算最小值的列;2. over()定义窗口范围;3. order by指定排序方式;4. rows between表示从第一行到当前行。此方法可用于分析趋势、累计统计等场景,如计算历史最低销售额、股票最低价、玩家最佳成绩等,使用时注意排序字段应唯一或有序,建议显式指定窗口范围以确保准确性。
在 SQL 中,MIN() OVER() 通常用来计算窗口内的最小值。但如果你希望它“按顺序取最小值”,就需要结合 ORDER BY 子句来控制窗口的排序和范围。
简单来说:你想让每一行都看到前面所有数据中的最小值,而不是整个字段的全局最小值。这在分析趋势、累计统计等场景中非常有用。
基本语法如下:
MIN(column_name) OVER (ORDER BY order_column ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
这样写的意思是:每一行都会看到从第一行到当前行之间所有数据的最小值。
举个例子:
假设你有如下销售记录表(sales):
date | amount |
---|---|
2023-01-01 | 100 |
2023-01-02 | 80 |
2023-01-03 | 90 |
2023-01-04 | 70 |
你想知道每一天之前(包括当天)的最低销售额,可以这样写:
SELECT date, amount, MIN(amount) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS min_so_far FROM sales;
结果会是:
date | amount | min_so_far |
---|---|---|
2023-01-01 | 100 | 100 |
2023-01-02 | 80 | 80 |
2023-01-03 | 90 | 80 |
2023-01-04 | 70 | 70 |
可以看到,min_so_far 是随着日期递增不断更新的“历史最小值”。
例如:
MIN(amount) OVER (PARTITION BY user_id ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
这种技巧常用于:
只要涉及到随时间变化的累计最小值,都可以考虑使用这个方法。
基本上就这些,虽然看起来有点复杂,但其实逻辑很简单:先排好序,再定义窗口范围,然后取最小值。掌握后你会发现它真的很实用。
以上就是sql 中 min () over order by 用法_sql 中 min () over 按序取最小值技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号