m0_67122663 2024-07-03 20:39 采纳率: 80%
浏览 0
已结题

SPARK SQL查找问题

SPARK SQL查找问题。比如目前A表的班组信息是我手工填写的,比如A组班组信息没有,需要从B表里面查找,关键字是姓名和统计日期,
注:同一个人在不同的日期,班组是不一样的。
比如第一个a表
姓名:张三,统计日期 2024/4/1 ,到B表里面去匹配班组,显示是【三组】
姓名:张三,统计日期 2024/4/11 ,到B表里面去匹配班组,显示是【十组】,为啥子是【十组】呢,因为张三在B里面里面,统计日期小于等于11号的,且按日期排序【从小到大】最后的班组显示是十组 。

所以用SQL怎么去匹配,我直接用LEFT JOIN 去匹配好像行不通。

img

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-07-03 20:39
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在SPARK SQL中,要解决你的问题,你可以使用一种称为“窗口函数”的技术来找到最接近但小于或等于指定日期的班组信息。这里是一个可能的解决方案:

    1. 首先,你需要创建一个窗口函数,使用ROW_NUMBER()来为每个姓名在B表中按照统计日期进行排序,并分配一个序号。

    2. 然后,你可以使用LEFT JOIN来将A表和B表连接起来,但要确保连接条件包括姓名和统计日期。

    3. 最后,你可以使用WHERE子句来过滤出每个姓名对应的最晚日期的班组信息。

    这里是一个示例SQL查询,它应该能够实现你的需求:

    WITH RankedB AS (
      SELECT
        姓名,
        统计日期,
        班组,
        ROW_NUMBER() OVER (PARTITION BY 姓名 ORDER BY 统计日期 DESC) as rn
      FROM
        B表
    )
    SELECT
      A.姓名,
      A.统计日期,
      B.班组
    FROM
      A表 A
    LEFT JOIN RankedB B
      ON A.姓名 = B.姓名 AND A.统计日期 <= B.统计日期
    WHERE
      B.rn = 1
    

    这个查询的步骤如下:

    • WITH RankedB AS ...:创建一个名为RankedB的临时表,其中包含B表的数据,并使用ROW_NUMBER()窗口函数为每个姓名的记录按照统计日期降序排列,分配序号rn
    • SELECT A.姓名, A.统计日期, B.班组 ...:选择A表的姓名和统计日期,以及通过LEFT JOIN连接的B表的班组信息。
    • ON A.姓名 = B.姓名 AND A.统计日期 <= B.统计日期:连接条件是A表的姓名和统计日期必须与B表的姓名和统计日期匹配,且A表的统计日期要小于或等于B表的统计日期。
    • WHERE B.rn = 1:过滤条件是只选择每个姓名对应的序号为1的记录,即最接近但小于或等于A表中统计日期的记录。

    请注意,这个查询假设A表和B表的列名分别是姓名统计日期班组,并且这些列的数据类型是兼容的。你可能需要根据你的实际表结构调整列名和数据类型。

    希望这个解决方案对你有帮助!如果你有任何问题或需要进一步的帮助,请随时告诉我。

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

报告相同问题?

问题事件

  • 系统已结题 7月11日
  • 已采纳回答 7月3日
  • 创建了问题 7月3日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?