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

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条回答 默认 最新

  • 关注

    分区发号套一层子查询取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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 幻影123! 2022-03-14 00:32
    关注

    利用开窗函数,做一个辅助列,看每一条timeto是不是等于当前分组最小值,是的话打标。然后用where筛选所有打标了timeto是最小值的记录。如有不懂再问,望采纳!

    评论
  • 关注

    第一次接触开窗函数!!!!我学到好多!!!!!!!!!!!!!!!!!!!!好开心!!!!!!!!!!!!!!!!!!

    评论
查看更多回答(2条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 win11安卓子系统打开谷歌登录不了切使用浏览器显示处于离线状态
  • ¥15 三维直角坐标系下,给定一个平面内四个点坐标,如何将四个点逆时针排序
  • ¥15 UnityWebRequest访问内网地址502
  • ¥20 Python语言来实现牛顿法(Newton's Method)解决非线性(系统)方程的问题。
  • ¥15 matlab控制工业相机采集图像
  • ¥25 R里做折线图和柱状图
  • ¥20 使用kokkos移植项目,遇到问题
  • ¥15 求该问题的Matlab代码
  • ¥15 python下使用pdpbox为何提示has no attribute 'pdp_isolate'?
  • ¥15 求java web病房管理系统项目,用netbeans做的