SQL Server查询使用表到调用函数的结果

时间:2018-08-29 15:45:54

标签: sql sql-server

我对SQL Server有问题。我有一个带有机器语句的表,另一个带有生产数据的表。两个表之间的时间不相同,以获取相应的数据。我不知道如何加入这些表格。另外,我只需要过滤表A中的代码17。

例如:

表a

Machine  Code  Time
----------------------------------
EPSX     17    2018-08-28 12:09:32
EPSA     19    2018-08-28 12:09:39
EPSC     17    2018-08-28 11:10:58

表b

Machine  Waste(meters)  Time
-------------------------------------------
EPSX     57m            2018-08-28 12:09:38
EPSA     128m           2018-08-28 12:09:43
EPSC     12m            2018-08-28 11:11:02

所需的输出:

Machine  Code  Waste(meters)
----------------------------
EPSX     17    57m
EPSC     17    12m

我正在考虑通过以下陈述获得这种关系:

a.Machine = b.machine (this is easy)
AND a.Time > b.Time 
AND a.Time <= DATEADD(MINUTE, 2, b.Time)

我该如何解决?也许使用功能?我可以直接从表b的函数中获取正确的信息。但是我可以调用Table a并在函数调用中使用a.Time吗?

3 个答案:

答案 0 :(得分:0)

如果您知道时间戳总是只有一点点,那么您可以将时间四舍五入到最接近的分钟(用谷歌搜索),并将四舍五入的时间用作表格之间的FK。

答案 1 :(得分:0)

aEPSX的时间是2018-08-28 12:09:32,表b 2018-08-28 12:09:38中的时间是a.time < b.time,但是您正在测试{ {1}}。这行不通。更改为

a.Time > b.Time AND a.Time <= DATEADD(MINUTE, 2, b.Time)

或者您可以将其转过来进行测试

a.time BETWEEN DATEADD(MINUTE, -2, b.Time) AND b.time

在一起

b.time BETWEEN a.time AND DATEADD(MINUTE, 2, a.Time)

答案 2 :(得分:0)

select *
from tableA a cross apply (
    select top 1 waste from tableB b
    where b.Machine = a.Machine and b.Time >= a.Time
    order by b.Time
) c
where a.Machine = 17;

我通常会尽量避免使用top,但我会继续提供它作为一种简单的解决方案。