web-dev-qa-db-ja.com

集計関数を使用してMySQLクエリでグループ化されたレコードの最初と最後のレコードを取得する方法は?

「グループ化された」レコードの最初と最後のレコードを取得しようとしています。
より正確には、このようなクエリを実行しています

SELECT MIN(low_price), MAX(high_price), open, close
FROM symbols
WHERE date BETWEEN(.. ..)
GROUP BY YEARWEEK(date)

しかし、グループの最初と最後のレコードを取得したいです。大量のリクエストを行うことでできますが、かなり大きなテーブルがあります。

MySQLでこれを行う(可能な場合は処理時間が短い)方法はありますか?

29
Jimmy

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での時間枠変換 の実行方法の例を含むこの記事を参照してください。

53
Joao Costa

試してみてください...:

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
2
Charles Bretana

この特定の問題に対する優れた具体的な解決策は次のとおりです。 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;
0
webmaster