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



我有两个桌子看起来像这样:

表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的日期组合的每种组合,我想从表2中撤回相应的度量值。如果表2中没有匹配那是&lt;表1的日期。使用上面的示例,我希望单元A和200分100 b。

如何将其转化为查询表格?我很难把头缠绕在上面。如果我只是在处理日期,那将很容易,但是单位组件是使我失望的原因。

通过使用左JOIN

获得确切的匹配非常容易
SELECT t1.Unit, t2.Metric
FROM Table1 t1 
LEFT JOIN Table2 t2 ON t2.Unit = t1.Unit AND t2.Date = t1.Date

使用此查询t2.如果没有确切的匹配,则t2。在没有确切匹配的情况下获得度量标准很棘手。在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];

相关内容

  • 没有找到相关文章

最新更新