我有两张看起来像这样的表:
表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中没有匹配,我想拉回下一个最近日期的度量值那是<表1中的日期。使用上面的例子,我希望A单元为100,B单元为200。
如何将其转换为查询表单?我一直很难缠绕它。如果我只是处理日期会很容易,但单位组件会让我失望。
答案 0 :(得分:0)
使用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];