我有两个大型的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
日期查询的结果来执行此操作?然后参考结果以快速插入新列?
答案 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
的执行方式而异)