Oracle 的分组排序玩法,真的是数据里的小神器。像分组统计Top N 查询函数这些用得挺多,是报表和排行榜的时候,效率还不错。

分组取 Top N,用RANK()ROW_NUMBER()DENSE_RANK()都行,主要看你要不要并列排名。想给每个学科挑前三名?嗯,用下面这段就挺顺手:

SELECT name, subject, score,
  RANK() OVER (PARTITION BY subject ORDER BY score DESC) AS rank
FROM students
WHERE RANK() OVER (PARTITION BY subject ORDER BY score DESC) <= 3;

函数的OVER()窗口语法也挺重要,别小看它,像ROW_NUMBER(),帮你给每组排序,分页时用得多。哦,对了,RANK()会跳名次,DENSE_RANK()不会,别搞错了。

有时候想找一条记录的前后值,可以用LAG()LEAD(),挺实用。库存流水、用户行为这种时序数据,简直就是刚需。

如果你平时做数据统计、复杂查询比较多,强烈推荐你多看看函数,效率高,SQL 也不绕,嗯,真香。