【发布时间】:2017-06-06 11:52:53
【问题描述】:
我正在尝试基于表 A 中的 ID 进行查询,以显示表 P 中具有相同 TimestampLocal 列广告表 A 的最近行。
我已经做到了:
IF(A.Generated - P.Local) >= 0 THEN
select P.Location where P.Local = A.Generated + MIN(A.Generated - P.Local)
ELSE
select P.Location where P.Local = A.Generated + MAX(A.Generated - P.Local)
我正在尝试从表 P 中获取值。
IF (select datediff(second, a.Generated,p.Local) from A a inner join P p on a.VId=p.VId where a.Id = 830566) >=0
select Location from P where Local = dateadd(millisecond,(select Min(datediff(second, a.Generated,p.Local)) from A a inner join P p on a.VId=p.VId where a.Id=830566),
(select Generated from A where Id=830566))
ELSE
select Location from P where Local =dateadd(second,(select Max(datediff(millisecond, a.Generated,p.Local)) from A a inner join P p on a.VId=p.VId where a.Id=830566),
(select Generated from A where Id=830566))
但我得到了错误:
子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
和
datediff 函数导致溢出。分隔两个日期/时间实例的日期部分的数量太大。尝试将 datediff 与不太精确的 datepart 一起使用。
但我不知道为什么 :( 可以根据表 A Id 从表 P 中获取最近的行吗?如果 P 中有多个具有相同 TimeStampLocal 的行来获取第一行?
更新
表 A:
Id Generated VId
830566 | 2017-06-04 10:38:22.2000000 -07:00 | 5635
830567 | 2017-06-04 10:38:45.1000000 -07:00 | 5634
830568 | 2017-06-04 10:31:59.6000000 -07:00 | 5638
表P:
VId Local Location
5638 | 2017-06-04 10:26:17.9000000 -07:00 | 0xE6
5638 | 2017-06-04 10:31:48.6000000 -07:00 | 0X7F
5638 | 2017-06-04 10:32:48.7000000 -07:00 | 0x3C
5634 | 2017-06-04 10:31:48.6000000 -07:00 | 0xA6
例如:对于表 A 中的 Id 830568(作为参数接收)-VId 5638,我应该从表 P 中获取最近的行,具有最接近的本地时间和相同的 VId,在这种情况下是第二个2017-06-04 10:31:48.6000000 -07:00,对于来自 P 的这一行,我需要获取位置:0X7F
【问题讨论】:
-
你能发布一些示例数据(作为插入...)和预期值(作为文本)吗?
-
@etsa 我已经进行了必要的更新
-
最接近的没有超过或最接近的时期?如果 VId 5638 有一个 10:32:00 应该返回还是仍然是您声明的值呢?
-
如果 VId 5438 是 10:32:00 而不是 10:31:59,它应该返回 10:32:00,因为那是最接近表 A 中的时间。最接近的时间不能t 是开始的准确小时和分钟
标签: sql-server tsql