1、你这个看起来好像是SQLSERVER,图片中的两种语法在Oracle等数据库中会报 “用户” 这个字段必须包含在 group by 或聚合函数中而无法执行,而你的数据库中,因为没有指定 “用户” 在group by语句或聚合函数中,因此,我估计是取原始输出数据(以年份为分组的窗口数据)的第一条作为 “用户”字段的输出值
2、数据库所有数据输出顺序都是看是否有指定的 order by 语句,你第一个语句中只有 t 子查询的 lead 窗口函数中涉及排序语句,所以所有数据输出都是以这个排序结果作为输出的顺序的,你的最外层输出的“用户”字段就是以这个排序结果的分组数据中的第一条数据,这个就不可预期了,如果每年都是第一个用户的第一条数据是满足要求的用户,那输出结果是正确的,如果不是,输出结果则是错误的
3、你的第二个语句中的最后排序是在 d 子查询的 rank 函数中,这个函数在这里的唯一作用就是按 “年” 分组,然后按“时间差”反向排序,这就将目标用户排序到了每个分组的第一位,因此输出就正确了。等效的写法你可以试下在第一个语句的 t 子查询中增加 order by 1, 3 desc 试下看,应该也能输出正确的结果
4、这种语句极其依赖数据库自身的引擎机制,换个数据库很可能就会出错,通用的写法是以第一个语句为基础,修改SELECT部分为:
SELECT 年份, FIRST_VALUE( 用户 ) OVER( PARTITION BY 年份 ORDER BY 时间差 DESC ) 用户
, FIRST_VALUE( 时间差 ) OVER( PARTITION BY 年份 ORDER BY 时间差 DESC ) 时间差
FROM …… GROUP BY 年份;
当然,等效的写法还有很多,这里只给你改动最小的一种写法而已
有点难哦
因为你要做排名才能取得准确呀,不做排名,你group取的用户就不正确了