如何查询SQL记录并从附加行中包含列数据?
我在SQL表中有一些数据,如下所示:如何查询SQL记录并从附加行中包含列数据?,sql,azure-sql-database,Sql,Azure Sql Database,我在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
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
...
我正在尝试编写一个查询,该查询将使用一个简单的WHERE子句返回与时间戳和符号匹配的所有记录,但也包括来自当前记录上一次迭代的上一个价格
例如,如果我想返回所有匹配symbol=ABC和timestamp=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是记录匹配符号=ABC的价格,并且迭代=2当前记录迭代值减去1
我可以通过代码实现几个查询和循环来实现这一点,但我希望找到一种在SQL本身中实现这一点的方法
可以从与查询记录匹配相同符号的上一次迭代的记录中检索价格数据?大多数数据库支持ANSI标准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';
对子查询中的符号进行筛选是安全的,因为它用于分区。但是,时间戳上的过滤器需要位于外部查询中,以便延迟完成其工作。您所需要做的就是使用问题中概述的条件将表连接到自身。这应该起作用:
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'
包括子查询以获取上一个价格。获取小于给定时间戳的时间戳的最大价格。这将给出与前一个时间戳对应的价格
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'
用你正在使用的数据库标记你的问题。太棒了。我没听说过拉格。它非常有用。对于阅读本文的其他人,我正在Azure上使用MS SQL。它支持滞后,没有问题。