m0_59470295 2022-10-31 18:30 采纳率: 86.7%
浏览 44
已结题

为啥用户名会显示不同但是结果相同

img

img


第一张图片的时间差算的是正确的,但是用户名不正确。第二张图片加了个rank()函数为什么用户名就正确了

  • 写回答

3条回答 默认 最新

  • leaf_cq 2022-11-01 09:31
    关注

    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 年份;
    

    当然,等效的写法还有很多,这里只给你改动最小的一种写法而已

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月9日
  • 已采纳回答 11月1日
  • 赞助了问题酬金1元 10月31日
  • 赞助了问题酬金1元 10月31日
  • 展开全部

悬赏问题

  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 angular开发过程中,想要读取模型文件,即图1的335行,会报404错误(如图2)。但我的springboot里配置了静态资源文件,如图3。且在该地址下我有模型文件如图4,请问该问题该如何解决呢?
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了
  • ¥100 H5网页如何调用微信扫一扫功能?
  • ¥15 讲解电路图,付费求解
  • ¥15 有偿请教计算电磁学的问题涉及到空间中时域UTD和FDTD算法结合的
  • ¥15 vite打包后,页面出现h.createElement is not a function,但本地运行正常
  • ¥15 Java,消息推送配置