0

我一直在尝试(无济于事)制定一个 SQL 查询,该查询将返回最近条目和大于 1 天前的第一个条目之间定价变化最大的行。

由于数据集很大,价格抓取需要相当长的时间,因此一次拉取的第一行和最后一行之间的时间通常是 ± 很多分钟。我希望能够从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。

谢谢!

4

2 回答 2

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 以外的数据库。无论如何,索引可以帮助提高性能。

于 2013-07-05T21:41:47.167 回答
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
于 2013-07-05T22:29:39.327 回答