0

我有一个巨大的表,其中包含数百万条按时间戳存储股票值的记录。结构如下:

Stock, timestamp, value

goog,1112345,200.4

goog,112346,220.4

Apple,112343,505

Apple,112346,550

我想按时间戳查询这张表。如果时间戳匹配,则应返回所有相应的股票记录,如果没有该时间戳的股票记录,则应返回前一个股票。在上面的例子中,如果我通过 timestamp=1112345 查询,那么查询应该返回 2 条记录:

  goog,1112345,200.4

  Apple,112343,505 (immediate previous record)

我尝试了几种不同的方法来编写此查询,但没有成功,我确定我遗漏了一些东西。有人可以帮忙吗。

4

3 回答 3

1
SELECT `Stock`, `timestamp`, `value`
FROM `myTable`
WHERE `timestamp` = 1112345
  UNION ALL
SELECT `Stock`, `timestamp`, `value`
FROM `myTable`
WHERE `timestamp` < 1112345
ORDER BY `timestamp` DESC
LIMIT 1
于 2013-01-17T23:41:22.220 回答
0

我不认为有一个简单的方法来做这个查询。这是一种方法:

select tprev.*
from (select t.stock,
             (select timestamp from t.stock = s.stock and timestamp <= <whatever> order by timestamp limit 1
             ) as prevtimestamp
      from (select distinct stock
            from t
           ) s
    ) s join
    t tprev
    on s.prevtimestamp = tprev.prevtimestamp and s.stock = t.stock

这是获取记录的前一个或相等的时间戳,然后将其重新加入。如果您在(股票,时间戳)上有索引,那么这可能会相当快。

它的另一个措辞使用group by

select tprev.*
from (select t.stock,
             max(timestamp) as prevtimestamp
      from t
      where timestamp <= YOURTIMESTAMP
      group by t.stock
    ) s join
    t tprev
    on s.prevtimestamp = tprev.prevtimestamp and s.stock = t.stock
于 2013-01-18T00:42:19.460 回答
0

select Stock, timestamp, value from thisTbl where timestamp = ?并填写时间戳到它应该是什么?您的演示查询可在此小提琴上找到

于 2013-01-17T23:39:08.380 回答