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 Stock, timestamp, value from thisTbl where timestamp = ?タイムスタンプを入力する必要がありますか?あなたのデモクエリはこのフィドルで利用できます

于 2013-01-17T23:39:08.380 に答える
0

このクエリを実行する簡単な方法はないと思います。1 つのアプローチを次に示します。

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 に答える