验证日期之间的日期退出并根据类型选择特定行

Posted

技术标签:

【中文标题】验证日期之间的日期退出并根据类型选择特定行【英文标题】:Verify the date exits between dates and pick the specific row based on type 【发布时间】:2020-05-29 14:42:31 【问题描述】:

表A

id        dtchk
1001    3/31/2018
1002    9/30/2018
1004    3/31/2019
1003    5/25/2018
1005    9/30/2019
1006    3/31/2020

表B

id     type  startdate  endate      name
1001    1    4/5/2018   12/31/2025  akshi
1002    100  4/27/2015  12/31/2023  polard
1004    100  4/1/2017   12/31/2019  kathi
1003    1    1/25/2018  5/25/2019   smoth
1005    1    3/21/2017  12/31/2020  sumi
1005    100  3/26/2019  12/31/2021  chechi
1006    1    2/28/2019  3/31/2021   paul
1006    100  2/28/2017  3/31/2019   rand

首先我们需要根据 id 验证 dtchk 是否在 startdate 和 endate 之间 如果这些日期之间存在日期,那么我们需要检查类型 如果类型 1 和 100 都适合,则选择类型为 100 的行 如果日期适合这些日期,则按原样选择

输出

id      name
1002    polard
1004    kathi
1003    smoth
1005    chechi
1006    paul

【问题讨论】:

您已经告诉我们您的目标,那么您的问题是什么?当您进行尝试时,什么没有奏效? 我厌倦了 cte 与 row_number 函数并左连接,但不太明白。 第一个问题是两个表之间的INNER JOIN,检查dtchk是否在区间内,第二个问题是按照你的规则加入第一行,看看在这里:***.com/questions/2043259/… 尝试解决它,并告诉我们您尝试了什么以及您遇到的问题。 把你的尝试放在问题中,@Quikr。 【参考方案1】:

我想你想要apply:

select a.*, b.*
from a cross apply
     (select top (1) with ties b.*
      from b
      where b.id = a.id and
            a.dtchk between b.startdate and b.endate and
            b.type in (1, 100)
      order by b.type desc
     ) b;

【讨论】:

当我们应用外部应用时它有什么不同,我会从表 b 中得到不匹配的值作为空值吗?这就是我所看到的,但只是想了解外部应用是如何工作的 Gordo 对不起,我没有意识到点击了两次,这是错误的。答案绝对有用 @Quikr 。 . . OUTER APPLY 将保留 a 中的所有行,即使没有匹配项。

以上是关于验证日期之间的日期退出并根据类型选择特定行的主要内容,如果未能解决你的问题,请参考以下文章

根据“小时”日期时间选择 Pandas 数据框行

Mysql查询检索帖子并根据特定日期间隔进行过滤

日期范围验证

如何设置开始日期和结束日期之间的验证应在 3 年内选择

根据可能位于特定列中任何位置的日期过滤文件

如何根据ios中的特定键从数组中获取字典