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