根据SQL中的另一个表计算一个表中值的差异

时间:2015-04-02 10:52:48

标签: sql sql-server tsql

我有2张桌子。 MarketAction具有我所发现的名为' B1'的价值,它将与' Ticks'匹配。 TickTable中的字段。

(MarketAction表是2500万行,TickTable是300行)

勾选表如下所示:

TickID    Ticks    MinorMagnet
140       2.80     1
141       2.82     0
142       2.84     0
143       2.86     1
144       2.88     0
145       2.90     0
146       2.92     0
147       2.94     0

我需要找到' TickDiff',并插入' B1'和' TickDiff'进入一个新的临时表。

如果我们查看了B1'的TickID?从TickTable中,我需要它来找到B1 TickID和最近的MinorMagnet = 1 TickID值(第一个更高(或零),第一个更低(或零))之间的TickID差异

这适用于高:

WITH T1 AS
(
    SELECT TOP 20 *, 
            144 - TickID AS TickDiff
    FROM TickTable
    WHERE MinorMagnet = 1
    ORDER BY ABS( Ticks - 2.88 )
)
SELECT TOP 1 *
FROM T1
WHERE TickDiff >= 0

如果我想要较低的一个,我可以修改:

SELECT TOP 1 *, ABS(TickDiff)
FROM T1
WHERE TickDiff <= 0

但显然有效,因为我明确说明了MarketAction的值。 B1 = 2.88和144是B1的TickID。

我尝试了各种各样的联接和其他事情......无法解决这个问题...

如何让它找到&#39; TickDiff&#39;对于MarketAction中的每个B1值?

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,那么这个查询可能就是你想要的:

select tickid, ticks, minormagnet, min(abs(tickdiff)) tickdiff 
from (
    select ma.TickID, t.Ticks, t.MinorMagnet, tickdiff = t.TickID - oa.TickID 
    from MarketAction ma
    join ticktable t on ma.TickID = t.TickID
    outer apply (
       select top 2 TickID 
       from ticktable 
       where MinorMagnet = 1 
       order by abs(t.Ticks-Ticks) 
    ) oa
) x
group by tickid, ticks, minormagnet;