第一个字段为空时如何获取下一个数据

问题描述 投票:0回答:1

我有 2 个表,我需要从中获取唯一记录。当条件不匹配时,我需要获取下一个有效值。

表A -

参考号 结束日期 开始日期
1234 20071010 20070618
1234 20051021 20050627
1234 20060608 20060220

B表-

参考号 比较日期 名字 姓氏
1234 19680611 约翰 史密斯
1234 20060220 约翰 梅森
1234 20070618 约翰 史密斯

结果应该是-

参考号 结束日期 开始日期 名字 姓氏
1234 20071010 20070618 约翰 史密斯
1234 20051021 20050627 约翰 梅森
1234 20060608 20060220 约翰 梅森

我当前的查询是

SELECT RN = ROW_NUMBER() OVER (ORDER BY A.Refno), A.Refno, A.Startdate, A.Firstname, A.Lastname, A.EndDate
  FROM Table A A
  LEFT JOIN Table B b
  ON A.Refno = B.Refno
  WHERE A.Startdate BETWEEN B.StartDate AND B.Enddate

我现在的成绩是

RN Refno 开始日期 名字 姓氏 结束日期
1 01000184 20070618 约翰 史密斯 20071010
2 01000184 20060220 约翰 梅森 20060608

没有存储过程是否可以得到我的结果?感谢任何帮助。

如果开始日期和结束日期在开始日期之间,我需要从一个表中获取名字和姓氏。当条件匹配时我得到了,但我需要所有 3 行的名字和姓氏来自另一行。

sql sql-server common-table-expression
1个回答
0
投票

我们可以使用

apply
获得离参考结束日期“最近”的行。由于我们忽略了开始日期,这很高兴地返回了“上一个”匹配项。

select row_number() over(partition by a.refNo order by a.startDate) rn,
    a.*, 
    b.firstName, b.lastName
from tablea a
outer apply (
    select top (1) b.*
    from tableb b
    where b.refNo = a.refNo and b.dateCompare <= a.dateEnd
    order by b.dateCompare desc
) b
order by rn
© www.soinside.com 2019 - 2024. All rights reserved.