基于最大日期 <= 给定日期加入

Posted

技术标签:

【中文标题】基于最大日期 <= 给定日期加入【英文标题】:Joining Based on the Max Date <= a Given Date 【发布时间】:2017-12-19 21:15:25 【问题描述】:

我有两个看起来像这样的表:

表 1:

Unit      Date
A         9/30/17
B         9/30/17

表 2:

Unit     Date      Metric
A        9/30/17   100
A        6/30/17   250
A        5/31/17   150
B        8/15/17   200
B        4/30/17   150
B        4/15/17   100

对于表 1 中的 Unit 和 Date 的每个组合,我想从表 2 中拉回相应的 Metric 值。如果在表 2 中没有匹配项,我想拉回下一个最接近日期的 Metric 值即

我怎样才能把它变成查询表单?我一直很难理解它。如果我只是处理日期,那会很容易,但 Unit 组件让我感到厌烦。

【问题讨论】:

@a_horse_with_no_name 我们在 Netezza 7.2 上。 【参考方案1】:

使用 LEFT JOIN 获得完全匹配相对容易

SELECT t1.Unit, t2.Metric
FROM Table1 t1 
LEFT JOIN Table2 t2 ON t2.Unit = t1.Unit AND t2.Date = t1.Date

使用此查询,如果没有完全匹配,t2.Metric 将为 NULL。 要获得没有完全匹配的指标是比较棘手的。在 MS SQL Server 中,您可以编写用户定义函数 (UDF) 来返回最接近的值。

create function dbo.udfGetMetric(@Unit char(1), @Date datetime) returns int
as 
BEGIN
declare @Metric smallint;
SELECT TOP(1) @Metric = Metric
FROM Table2 
WHERE Unit = @Unit
    and [Date] < @Date
ORDER BY [Date] DESC;

RETURN @Metric;
END
GO

当值为 NULL 时,您可以在查询中调用此函数

SELECT t1.Unit, ISNULL(t2.Metric, dbo.udfGetMetric(t1.Unit, t1.[Date])) as Metric
FROM Table1 t1 
LEFT JOIN Table2 t2 ON t2.Unit = t1.Unit AND t2.[Date] = t1.[Date];

您可以通过使用子查询而不是函数来做同样的事情:

SELECT t1.Unit
, ISNULL(t2.Metric, (SELECT TOP(1) Metric
                    FROM Table2 
                    WHERE Unit = t1.Unit
                        and [Date] < t1.[Date]
                    ORDER BY [Date] DESC)) as Metric
FROM Table1 t1 
LEFT JOIN Table2 t2 ON t2.Unit = t1.Unit AND t2.[Date] = t1.[Date];

【讨论】:

以上是关于基于最大日期 <= 给定日期加入的主要内容,如果未能解决你的问题,请参考以下文章

基于最大日期组的 Django ORM 数据

如何使用基于日期列的预测

基于日期 Xamarin 表单过滤 ObservableCollection

R-基于最近日期合并数据框

在 bigquery 中查询多个基于日期的表

NSPredicate 获取低于指定值的最大值