查找行之间价格的百分比变化

时间:2013-07-05 21:22:54

标签: sql database sqlite playframework

我一直在努力(无济于事)制定一个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。

谢谢!

2 个答案:

答案 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