我一直在努力(无济于事)制定一个SQL查询,该查询将返回最近一个条目和大于前一天的第一个条目之间定价变化最大的行。
由于数据集较大,价格刮取需要花费大量时间,因此一次拉动的第一行和最后一行之间的时间通常为±多分钟。我希望能够从x
时间或更长时间之前提取第一条记录,伪SELECT price FROM table WHERE date < [now epoch time in ms] - 86400000 LIMIT 1 ORDER BY date DESC
我的表格格式如下:(日期是以毫秒为单位的纪元时间)
itemid price date ...
-----------------------------------
... most recent entries ...
1 15.50 1373022446000
2 5.00 1373022446000
3 20.50 1373022446000
... first entries older than X milliseconds ...
1 13.00 1372971693000
2 7.00 1372971693000
3 20.50 1372971693000
我想要一个返回类似于以下结果的查询
itemid abs pct
----------------------------
1 +2.50 +19.2%
2 -2.00 -28.6%
3 0.00 0.00%
我不确定如何处理这个问题。似乎它应该可以通过查询完成,但我一直在努力取得任何进展。我在Play Framework 2.1.1上运行sqlite3。
谢谢!
答案 0 :(得分:0)
您可以使用相关子查询和联接来执行此操作。第一个问题是确定最近的价格。 tmax
通过获取每个项目的最新日期来帮助解决这个问题。然后将其与原始数据相结合,以获取价格等信息。
然后使用相关子查询将该先前价格作为该日期之前的至少xxx毫秒。请注意,这是基于原始日期的相对时间跨度。如果你想要一个绝对的时间跨度,那么就当前时间进行日期算术。
select t.itemid, t.price - t.prevprice,
(t.price - t.prevprice) / t.price as change
from (select t.*,
(select t2.price
from yourtable t2
where t2.itemid = t.itemid and
t2.date < t.date - xxx
order by date
limit 1
) as prevprice
from yourtable t join
(select itemid, max(date) as maxdate
from yourtable t
group by itemid
) tmax
on tmax.itemid = t.itemid and tmax.maxdate = t.date
) t
如果您有大量数据,您可能会考虑升级到SQLite以外的数据库。无论如何,索引可以帮助提高性能。
答案 1 :(得分:0)
如果我正确阅读了您的问题,您需要每个itemnid
的第一个价格和最后一个价格之间的差异和%。
我认为这会对你有所帮助:
select
t1.itemid,
(select top 1 price from table tout where tout.itemid = t1.itemid order by date desc) -
(select top 1 price from table tout where tout.itemid = t1.itemid order by date) as dif,
((select top 1 price from table tout where tout.itemid = t1.itemid order by date desc) -
(select top 1 price from table tout where tout.itemid = t1.itemid order by date)) /
(select top 1 price from table tout where tout.itemid = t1.itemid order by date desc) * 100 as percent
from
table t1
group by t1.itemid