sql - 如何在 SQL Server 中获取最接近记录日期的日期?
问题描述
我有以下数据结构:
表 A:
ID | RequestNumber | Date
----+-----------------+-----------
1 | 1 | 2017/09/27
2 | 1 | 2018/06/02
表 B:
RequestNumber | Serial | Date
---------------+----------+-----------
1 | 1 | 2017/09/27
1 | 2 | 2017/09/27
1 | 6 | 2018/06/03
1 | 7 | 2018/06/03
1 | 8 | 2018/06/03
正如我们所见,最接近第一行的日期Table A
是 2017/09/27,Table B
最接近第二行的日期是 2018/06/03Table B
所以...
我需要一个查询来让每一行从最接近记录的Table A
所有行开始(这意味着第一个记录应该返回 2 条记录,第二条记录应该返回 3 条记录)Table B
Table A
预期的结果是:
ID | RequestNumber | Serial | Date
----+-----------------+----------+------------
1 | 1 | 1 | 2017/09/27
1 | 1 | 2 | 2017/09/27
2 | 1 | 6 | 2018/06/03
2 | 1 | 7 | 2018/06/03
2 | 1 | 8 | 2018/06/03
提前致谢
解决方案
此查询将执行您想要的操作。它连接TableA
到TableB
on RequestNumber
,然后连接到 和 之间的最小值表,DATEDIFF
确保我们只获得结果中最接近的日期:TableB
TableA
SELECT a.ID, a.RequestNumber, b.Serial, b.Date
FROM TableA a
JOIN TableB b ON b.RequestNumber = a.RequestNumber
JOIN (SELECT a.ID AS ID, MIN(ABS(DATEDIFF(day, b.Date, a.Date))) AS days
FROM TableA a
JOIN TableB b ON b.RequestNumber = a.RequestNumber
GROUP BY a.ID) c ON c.ID = a.ID AND c.days = ABS(DATEDIFF(day, b.Date, a.Date))
输出:
ID RequestNumber Serial Date
1 1 1 27/09/2017 09:30:00
1 1 2 27/09/2017 09:30:00
2 1 6 03/06/2018 09:30:00
2 1 7 03/06/2018 09:30:00
2 1 8 03/06/2018 09:30:00
推荐阅读
- javascript - 引用 node_modules 文件夹的更好方法
- sum - 对方阵求和
- oracle - 另一种组合
- eclipse - 不存在 WebApplication 提供程序
- javascript - 向下滚动时隐藏,向上滚动时立即显示,纯css
- javascript - 按钮启动时 MaterializeCss 链接被禁用,javascript 不会启用
- c# - 由于无参数构造函数,使用 IMultipleResults 从存储过程填充 KeyValuePair 失败
- reactjs - React:React-bootstrap 模式在 ie 10 中不起作用
- slf4j - 如何扫描/检查包中的 Java 类以获取 @slf4j 注释
- r - lapply 在 R 中进行第二次迭代