2017-10-04 14 views
1

我有一个SQL表看起来像下面的一些数据:如何查询SQL记录并将列数据包括在附加行中?

TIMESTAMP SYMBOL PRICE VOLUME RATIO ITERATION 
2017-10-04 ABC  1.23 12  0.78 1 
2017-10-05 ABC  1.33 10  0.49 2 
2017-10-06 ABC  1.73 10  0.69 3 
2017-10-04 XYZ  1.73 10  0.69 1 
... 

我想写一个查询,将返回所有的记录匹配timestampsymbol(使用简单WHERE条款) ,但是也是包括之前的price从当前记录以前的iteration

例如,如果我想返回所有匹配symbol=ABCtimestamp=2017-10-06记录,查询将返回:

TIMESTAMP SYMBOL PRICE VOLUME RATIO ITERATION PREV_PRICE 
2017-10-06 ABC  1.73 10  0.69 3   1.33 

其中PREV_PRICE是匹配symbol=ABCiteration=2(当前记录迭代值减去记录的price 1)。

我可以通过代码通过执行几个查询和循环来做到这一点,但我希望能够在SQL本身中找到一种方法。

从查询记录中匹配相同symbol的先前迭代记录中检索price数据是可能的吗?

+0

用你正在使用的数据库标记你的问题。 –

回答

2

大多数数据库都支持ANSI标准lag()。但是你必须要小心,因为你需要过滤之前做lag()

select t.* 
from (select t.*, 
      lag(t.price) over (partition by symbol order by timestamp) as prev_price 
     from t 
     where t.symbol = 'ABC' 
    ) t 
where t.timestamp = '2017-10-06'; 

与过滤symbol子查询是安全的,因为那是用来划分。但是,timestamp上的筛选器需要位于外部查询中,因此lag()才能完成其工作。

+0

令人惊叹。我没有听说过'lag()'。它超级有用。而对于其他读者,我正在使用MS SQL(在Azure上)。它支持'lag()'没问题。 – Brett

1

您需要做的就是使用您在问题中列出的标准将表加入自己。这应该工作:

SELECT t1.*, t2.PRICE as PREV_PRICE 
FROM my_table t1 
    LEFT JOIN my_table t2 ON (t2.SYMBOL = t1.SYMBOL AND t2.ITERATION = (t1.ITERATION - 1)) 
WHERE t1.TIMESTAMP = '2017-10-06' 
    AND t1.SYMBOL = 'ABC' 

你也可以做同样的使用子查询:

SELECT t1.*, 
    (SELECT PRICE FROM my_table t2 WHERE t2.ITERATION = (t1.ITERATION - 1)) AS PREV_PRICE 
FROM my_table t1 
WHERE t1.TIMESTAMP = '2017-10-06' 
    AND t1.SYMBOL = 'ABC' 
0

包含一个子查询,以获得以前的价格。获取时间戳的最大价格小于给定的时间戳。这将给出与之前时间戳相对应的价格。

SELECT y1.*, 
     (SELECT max (price) 
     FROM yourtable y 
     WHERE symbol = 'ABC' 
      AND timestamp < '2017-10-06') prev_price 
    FROM yourtable y1 
WHERE symbol = 'ABC' 
    AND timestamp = '2017-10-06' 
相关问题