将按日期较早/较晚的最近相邻行返回到另一个表的日期

Posted

技术标签:

【中文标题】将按日期较早/较晚的最近相邻行返回到另一个表的日期【英文标题】:return nearest adjacent rows that are earlier/later by date to another table's date 【发布时间】:2021-12-13 22:46:54 【问题描述】:

问题:基于以下返回单个结果集

对于报告表 (rdate) 中的每个日期,将早于或等于 rdate(加上 t1 和 t2)的最新事务表 (tdate) 返回为 sdate,s1,s2

对于报告表 (rdate) 中的每个日期,将晚于或等于 rdate(加上 t1 和 t2)的最早事务表 (tdate) 返回为 edate,e1,e2

已尝试 TOP 1 / APPLY / LEAD& LAG 代码,但无法获得所需的结果。

感谢任何建议。谢谢

报告表

rdate
06/01/2021
26/01/2021
15/02/2021

交易表

tdate t1 t2
01/01/2021 17 6
05/01/2021 5 9
09/01/2021 8 12
19/01/2021 15 11
20/01/2021 12 8
25/01/2021 9 1
26/01/2021 8 17
30/01/2021 7 6
08/02/2021 6 21
22/02/2021 14 5
27/02/2021 11 4

需要结果

rdate sdate s1 s2 edate e1 e2
06/01/2021 05/01/2021 5 9 09/01/2021 8 12
26/01/2021 26/01/2021 8 17 26/01/2021 8 17
15/02/2021 08/02/2021 6 21 22/02/2021 14 5

【问题讨论】:

【参考方案1】:

CROSS APPLYOUTER APPLY 以及具有适当顺序和过滤条件的 SELECT TOP 1 应该可以解决问题。试试:

DECLARE @ReportTable TABLE (rdate DATETIME)
INSERT @ReportTable
VALUES
    ('2021-01-06'),
    ('2021-01-26'),
    ('2021-02-15')

DECLARE @TransactionTable TABLE (tdate DATETIME, t1 INT, t2 INT)
INSERT @TransactionTable
VALUES
    ('2021-01-01', 17, 6),
    ('2021-01-05', 5, 9),
    ('2021-01-09', 8, 12),
    ('2021-01-19', 15, 11),
    ('2021-01-20', 12, 8),
    ('2021-01-25', 9, 1),
    ('2021-01-26', 8, 17),
    ('2021-01-30', 7, 6),
    ('2021-02-08', 6, 21),
    ('2021-02-22', 14, 5),
    ('2021-02-27', 11, 4)

SELECT * -- TODO: Assign meaningful names here
FROM @ReportTable R
OUTER APPLY (
    SELECT TOP 1 *
    FROM @TransactionTable T1
    WHERE T1.tdate <= R.rdate
    ORDER BY T1.tdate DESC
) S
OUTER APPLY (
    SELECT TOP 1 *
    FROM @TransactionTable T2
    WHERE T2.tdate >= R.rdate
    ORDER BY T2.tdate
) E
ORDER BY R.rdate

OUTER APPLY 类似于 LEFT JOIN 等效于 CROSS APPLY,允许找不到记录。仔细查看不等式条件以确保边缘情况符合预期。

【讨论】:

感谢...进行小编辑 .... WHERE T2.tdate >= R.rdate 完成,现在与发布的“所需结果”相匹配。日期范围的两端都关闭是不寻常的。通常我会看到 DateRangeStart 需要确保如果 tdate = rdate,则返回该日期的只有 t1/t2

以上是关于将按日期较早/较晚的最近相邻行返回到另一个表的日期的主要内容,如果未能解决你的问题,请参考以下文章

SQL 仅返回具有较晚日期的行

计算2个时间之间经过多少Ticks

Excel使用VLOOKUP函数填充后有的单元格会出现 #N/A 这个符号,是怎么回事?

如何根据日期选择组中的单行?

Laravel 获取连接表的最近日期

SQL 返回最近日期和下一个日期的课程列表