2016-04-23 7 views
0

次のクエリは、relative_strength_indexテーブルに存在しないすべての行を取得します。しかし、は、history_dataテーブルから日付ascに基づいて各シンボルの最初の14行を削除する必要があります。私はこれを行ういくつかの試みを試みたが、14日間で本当の問題を抱えている。この問題はどのように解決され、現在のクエリに追加できますか?何をしたいクエリから各シンボルの最初の14を削除します

現在のクエリ

select * 
from historical_data hd 
where not exists (select rsi_symbol, rsi_date from relative_strength_index where hd.symbol = rsi_symbol and hd.histDate = rsi_date); 

答えて

0

は制限句の最初の引数です。昇順でどの行を始めるかを指定します。この本のようにLIMITと一緒にOFFSET

select * from historical_data hd where not exists (select rsi_symbol, rsi_date from relative_strength_index where hd.symbol = rsi_symbol and hd.histDate = rsi_date ORDER BY rsi_date ASC LIMIT 14) 
+0

私の質問は明確ではありませんでした。 relative_strength_indexテーブルではなく、historical_dataテーブルから削除された最初の14行が必要です。 – TerryDisplaced

+0

ああ、外側の選択肢に限界を移動してください。 – Doug

+0

これを行うと、最初のシンボルのhistorical_dataテーブルの最初の14行だけが取得されます。 – TerryDisplaced

0

使用は、行15

select * 
from historical_data hd 
where not exists (select rsi_symbol, rsi_date from relative_strength_index where hd.symbol = rsi_symbol and hd.histDate = rsi_date) 
order by date asc 
limit 100000 offset 14; 

から始まる100,000行の最大値を返しますが、あなたが制限を使用してオフセットしているので、あなたには、いくつかによってBY注文したいかもしれませんリミットとオフセットを指定する前に注文してください。あなたは、各シンボルためを述べ

UPDATEので、このクエリを試してみてください、それが唯一のランク> = 15

SELECT * 
FROM 
    (select hd.*, 
     CASE WHEN @previous_symbol = hd.symbol THEN @rank:[email protected]+1 
     ELSE @rank := 1 
     END as rank, 
     @previous_symbol := hd.symbol 
    from historical_data hd 
    where not exists (select rsi_symbol, rsi_date from relative_strength_index where hd.symbol = rsi_symbol and hd.histDate = rsi_date) 
    order by hd.symbol, hd.date asc 
    )T 
WHERE T.rank >= 15 
0

それは(にはっきりしていない行を選択し、その後、日付昇順に基づいて各シンボルをランク付け私は何を返すか、または行を返すかどうかを指定する条件を指定します。

私たちが続けなければならないのは、各シンボルの「最初の14行」または「最初の14日」を除外するために、紛らわしい曖昧な説明です。

私たちが持っていないものは、データの再サンプリングサンプルまたは返される行の例です。

これがなければ、仕様の説明を理解できるかどうかを知る方法がなく、テスト結果を比較したり比較したりすることはありません。

ですから、基本的には推測しています。 (enthusiatss「これを試してみてください」が提供する解答の中で最も人気のある種類のようですどの。)


私はあなたの仕様に合うかもしれない、いくつかのパターンのいくつかの例を提供し、してもしなくてもよいことができます。

各 `symbol`に対して最も早く` histdate`を取得し、それに14日を追加するには、インラインビューを使用できます。インラインビューから返された日付の前に `histdate`を持つ行を除外するために、` historical_data`データに対して半結合を行うことができます。

(これは `histdate`列のデータ型がDATEであるという仮定に基づいている。)

SELECT hd.* 
    FROM (SELECT d.symbol 
       , MIN(d.histdate) + INTERVAL 14 DAY AS histdate 
      FROM historical_data d 
      GROUP BY d.symbol 
     ) dd 
    JOIN historical_data hd 
    ON hd.symbol = dd.symbol 
    AND hd.histdate > dd.histdate 
ORDER 
    BY hd.symbol 
    , hd.histdate 

しかし、そのクエリは` relative_strength_index`テーブルへの参照を含んでいません。元の照会には、 `relative_strength_index`表の相関副照会を持つNOT EXISTS述部が含まれています。

目標が、そのテーブルからの各 `rsi_symbol`に対して最も早い` rsi_date`を取得し、その値に14日を追加する場合...

SELECT hd.* 
    FROM (SELECT rsi.rsi_symbol 
       , MIN(rsi.rsi_date) + INTERVAL 14 DAY AS rsi_date 
      FROM relative_strength_index rsi 
      GROUP BY rsi.rsi_symbol 
     ) rs 
    JOIN historical_data hd 
    ON hd.symbol = rs.rsi_symbol 
    ON hd.histdate > rs.rsi_date 
ORDER 
    BY hd.symbol 
    , hd.histdate 

目標はrelative_strength_indexに一致する行がすでに存在する行を除外することであるならば、私はアンチ参加パターンを使用しますが...

SELECT hd.* 
    FROM (SELECT d.symbol 
       , MIN(d.histdate) + INTERVAL 14 DAY AS histdate 
      FROM historical_data d 
      GROUP BY d.symbol 
     ) dd 
    JOIN historical_data hd 
    ON hd.symbol = dd.symbol 
    AND hd.histdate > dd.histdate 
    LEFT 
    JOIN relative_strength_index xr 
    ON xr.rsi_symbol = hd.symbol 
    AND xr.rsi_date = hd.histdate 
WHERE xr.rsi_symbol IS NULL 
ORDER 
    BY hd.symbol 
    , hd.histdate 

は、これらは単なる例のクエリパターン、ありますあなたの正確な仕様には合っていない可能性があります。

詳細な仕様がなくても、他のパターンの例を提供することはあまり意味がありません。

関連する問題