不试一下怎么知道我不行? 2022-03-13 23:12 采纳率: 91.3%
浏览 466
已结题

SQL:left join取右表符合条件的第一条结果怎么操作?

需求:想要查询一条休假记录Record所对应的休假额度Ration里结束时间最早的那个休假额度。对应的条件是:Record的timefrom和timeto要在Ration的timefrom和timeto之间。

举个例子:3/12-3/13我请了两天假,额度A(2022/1/1-2022/6/1)、额度B(2022/3/1-2022/9/1)按时间来看都能当作我这次休假所用的额度,但是扣除额度只要从一个额度中扣除就好了,不能重复扣除,这里默认从较早结束的额度里扣除(就是额度A)

补充:因为这个需求只是我完成整个sql的一小部分,我整体是想要查找好多条record对应他们应扣除的额度,聚合求sum的,所以解决方案不能是说拿到结果集以后直接取第一条这样子解决,我需要在聚合前就能拿到确定的那一条额度。

select * from Record r
left join Ration ra on r.TimeFrom>=ra.RationTimeFrom and r.TimeTo<=ra.RationTimeTo
这样子会有很多一条record对应多条ration的情况。然后我卡在这写不下去了。

求大lao帮忙看看sql怎么写!谢谢!蛮急的!

  • 写回答

3条回答 默认 最新

  • 三千烦恼丝xzh 2022-03-14 00:28
    关注

    分区发号套一层子查询取top1,需要数据库支持开窗函数

    select * from (
    select * , row_number() over(partition by r.主键 order by r.TimeFrom) rn from Record r
    left join Ration ra on r.TimeFrom>=ra.RationTimeFrom and r.TimeTo<=ra.RationTimeTo
    ) tmp where tmp.rn = 1
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月23日
  • 已采纳回答 3月15日
  • 创建了问题 3月13日

悬赏问题

  • ¥15 网络科学导论,网络控制
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)