2017-12-25 18 views
1

アム過去30日間の最小値を見つけようと、私のテーブルに毎日のための1つのエントリは、このクエリMIN値は

SELECT MIN(low), date, low 
FROM historical_data 
WHERE name = 'bitcoin' 
ORDER BY STR_TO_DATE(date,'%d-%m-%Y') DESC 
LIMIT 7 

しかし、正しいをreturingないこの値を使用していますがあり値。私のテーブルの構造は、ストアがある

表構造 enter image description here

とテーブルデータはこの

表データスタイルのようです enter image description here

今、何が必要最低限​​の低いを取得することです値。しかし、それがうまくいかない私の質問は、テーブルにも存在しない私に間違った価値を与えてしまいます。

更新:ここ

私の更新されたテーブル構造です。 enter image description here

そして、ここでは、データを見れば今、この enter image description here

のように見えるこのテーブルの私のデータは、私が過去7日から低い値をトークンomisegoの名前をチェックしてfatchしたいです2017-12-25から2017-12-19 であり、このキャストで低い値は9.67ですが、私の現在のクエリと私の一部のメンバーによって提案されたクエリは正解をもたらしませんでした。

アップデート2:

http://rextester.com/TDBSV28042 

ここでは、基本的に私はそこ2017-12-25のように同じ日に私もっとそして1400件のエントリがしますが、異なる持つことを意味し、よりその後1400coinstoken履歴データを、持っている、です名前、合計私は650000以上のレコードがあります。すべての日付には異なる名前のエントリが多数あります。

+0

別の属性上に別の条件を指定する必要があり、これらの中で1行を選択するために、それは低い値が同じである複数のレコードを返すことに注意してくださいあなたの前の質問のhttps://stackoverflow.com/questions/47966447/calculate-volatility-ratio-of-historical-data-of-cryptocurrency-market-capitaliz –

+0

@FunkFortyNiner前の質問では完全に異なっていません。私はボラティリティを計算しますそれは別のものであり、ここでは価値が低くなっていますが、全く異なる方向性があります。どのようにそれらが同じであると言われている –

+0

@FunkFortyNinerは、ボラティリティ比を計算するために使用されている式をチェックします。 –

答えて

1

あなたができた7日あるいはn日の最後の30日のために

SELECT a.* 
FROM historical_data a 
LEFT JOIN historical_data b ON a.name = b.name 
AND a.low > b.low 
WHERE b.name IS NULL 
AND DATE(a.date) >= '2017-12-19' AND DATE(a.date) <= '2017-12-25' 
AND a.name = 'omisego' 

または

SELECT a.* 
FROM historical_data a 
JOIN (
    SELECT name,MIN(low) low 
    FROM historical_data 
    GROUP BY name 
) b USING(name,low) 
WHERE DATE(a.date) >= '2017-12-19' AND DATE(a.date) <= '2017-12-25' 
AND a.name = 'omisego' 

DEMO

次使用することができますグループごとに最低の行を取得するには上記の質問には、

SELECT a.*, DATE(a.`date`) 
FROM historical_data2 a 
LEFT JOIN historical_data2 b ON a.name = b.name 
AND DATE(b.`date`) >= CURRENT_DATE() - INTERVAL 30 DAY 
AND DATE(b.`date`) <= CURRENT_DATE() 
AND a.low > b.low 
WHERE b.name IS NULL 
AND a.name = 'omisego' 
AND DATE(a.`date`) >= CURRENT_DATE() - INTERVAL 30 DAY 
AND DATE(a.`date`) <= CURRENT_DATE() 
; 

DEMO

しかし、あなたはあなたのポストが再投稿になりそうだ

+1

あなたの努力のためにありがとう、その仕事 –

+0

@M Khalid Junaid私はループ全体を見つける。私は同じ日付の複数のエントリを持っているが、私の結果は –

+0

@SaraTariqここにサンプルデータを追加することができますhttp://rextester.comとあなたの質問にもあなたの期待されるデータを追加することができます上記のコメント正確な問題は何か明確ではありません –

0

が同じグループ化と句構造を考えると

SELECT name, date, MIN(low) 
FROM historical_data 
GROUP BY name 
HAVING name = 'bitcoin' 
AND STR_TO_DATE(date, '%M %d,%Y') > DATE_SUB(NOW(), INTERVAL 30 DAY); 

を実行している考えてみて、上記のクエリは、あなたの結果を取得する必要があります。

+0

それは低い値を得るが、過去30日間からではない。それは全体的に低い値を与える –

+0

これは何も戻っていない。 –

+0

問題!日付はVARCHAR – RiggsFolly

0

//このコードを試してください。

SELECT MIN(`date`) AS date1,low 
     FROM historical_data 
WHERE `date` BETWEEN now() - interval 1 month 
        AND now() ORDER by low ASC; 
+0

ありがとうございます。それは私に、最も低い値を持つ正しい日付を示していますが、値が間違った値を選ぶのは正しくありません。値が日付と一致しないことを意味します –

+0

クエリでデータ形式を変更してください。日付の形式が変更されているため、日付が比較されません.... now()関数はデフォルトの日付構造を取得します... –

+0

私はフォーマットでは、あなたはそれを確認することができます更新セクションでは、現在日付の形式はdatetimeです –