SQL-比较2个表中的日期,检索最新的

时间:2019-02-13 23:18:43

标签: sql sql-server

我有两个大型的MS SQL Server表(A & B),将在这里进行概括。我试图在TableA派生的TableB中创建一个新列,其中包含每行TableB.refDate之前的最新TableA.dataDate。数据集非常大,但是这些DISTINCT日期查询运行很快。只需关注每个表中的不同日期,无需其他匹配条件。

SELECT DISTINCT dataDate FROM TableA
> 2019-02-13
> 2019-02-09
> 2019-02-05

SELECT DISTINCT refDate FROM TableB
> 2019-02-13
> 2019-02-12
> 2019-02-10
> 2019-02-07
> 2019-02-05
> 2019-02-04

最终结果应该类似于:

dataDate     mostRecentRefDate
2019-02-13   2019-02-12
2019-02-09   2019-02-07
2019-02-05   2019-02-04

从理论上讲,应该遵循这些原则,但是数据集太大:

SELECT
DISTINCT a.dataDate as dataDate,
(SELECT MAX(b.refDate) FROM TableB b WHERE a.dataDate > b.refDate) as mostRecentRefDate
FROM TableA a

是否有更好的方法利用这些初始DISTINCT日期查询的结果来执行此操作?然后参考结果以快速插入新列?

3 个答案:

答案 0 :(得分:0)

您可能想尝试一下:

let A = 1;
let B = 1;

console.log('A++ === 2', A++ === 2);
console.log('++B === 2', ++B === 2);

答案 1 :(得分:0)

假设您还需要除日期之外的其他列,我建议您使用apply

select a.*, b.*
from a outer apply
     (select top (1) b.*
      from b
      where b.refdate < a.datadate
      order by b.refdate desc
     ) b;

答案 2 :(得分:0)

您可以尝试以下

WITH T(date, source) AS
(
SELECT DISTINCT dataDate, 'A' 
FROM TableA
UNION ALL
SELECT DISTINCT refDate, 'B'
FROM TableB
), T2 AS
(
SELECT   * ,
         mostRecentRefDate = MAX(CASE WHEN source = 'B' THEN date END) 
                        OVER (ORDER BY date, source ROWS UNBOUNDED PRECEDING)
FROM     T
)
SELECT date AS dataDate, mostRecentRefDate
FROM T2
WHERE source = 'A'

此计划看起来不错(尽管您的计划可能因DISTINCT的执行方式而异)

enter image description here