「グループ化された」レコードの最初と最後のレコードを取得しようとしています。
より正確には、このようなクエリを実行しています
SELECT MIN(low_price), MAX(high_price), open, close
FROM symbols
WHERE date BETWEEN(.. ..)
GROUP BY YEARWEEK(date)
しかし、グループの最初と最後のレコードを取得したいです。大量のリクエストを行うことでできますが、かなり大きなテーブルがあります。
MySQLでこれを行う(可能な場合は処理時間が短い)方法はありますか?
GROUP_CONCAT
およびSUBSTRING_INDEX
を使用する場合:
SUBSTRING_INDEX( GROUP_CONCAT(CAST(open AS CHAR) ORDER BY datetime), ',', 1 ) AS open
SUBSTRING_INDEX( GROUP_CONCAT(CAST(close AS CHAR) ORDER BY datetime DESC), ',', 1 ) AS close
これにより、高価なサブクエリが回避され、この特定の問題に対しては一般的に効率的であることがわかりました。
両方の関数のマニュアルページを参照して引数を理解するか、詳細な説明については MySQLでの時間枠変換 の実行方法の例を含むこの記事を参照してください。
試してみてください...:
Select YearWeek, Date, Min(Low_Price), Max(High_Price)
From
(Select YEARWEEK(date) YearWeek, Date, LowPrice, High_Price
From Symbols S
Where Date BETWEEN(.. ..)
GROUP BY YEARWEEK(date)) Z
Group By YearWeek, Date
この特定の問題に対する優れた具体的な解決策は次のとおりです。 http://topwebguy.com/first-and-last-in-mysql-a-working-solution/ MySQLでFIRSTとLASTを使用するのとほとんど同じくらい簡単です。
実際にソリューションを提供するコードを含めますが、テキスト全体を調べることができます。
SELECT
Word ,
(SELECT a.ip_addr FROM article a
WHERE a.Word = article.Word
ORDER BY a.updated LIMIT 1) AS first_ip,
(SELECT a.ip_addr FROM article a
WHERE a.Word = article.Word
ORDER BY a.updated DESC LIMIT 1) AS last_ip
FROM notfound GROUP BY Word;