【问题标题】: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

【问题讨论】:

    标签: sql-server sql-server-2019


    【解决方案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
    猜你喜欢
    • 2010-10-21
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 2019-08-16
    • 2017-02-22
    • 1970-01-01
    相关资源
    最近更新 更多