11

約 500,000 のレコードと約 50 または 60 の列を持つテーブルでクエリを作成しようとしています。私が必要とするのは、これらのレコードをグループにまとめて、各グループの最大レコードを選択することです。

問題を単純化するために、次のような表があります

+----+-------------+----------+--------+
| id | external_id | group_id | mypath |
+----+-------------+----------+--------+
|  1 |        1003 |        1 | a      | 
|  2 |        1004 |        2 | b      | 
|  3 |        1005 |        2 | c      | 
+----+-------------+----------+--------+

単純なグループ化は次のとおりです

select * from temp GROUP BY group_id

返す

+----+-------------+----------+--------+
| id | external_id | group_id | mypath |
+----+-------------+----------+--------+
|  1 |        1003 |        1 | a      | 
|  2 |        1004 |        2 | b      | 
+----+-------------+----------+--------+

素敵ですが、私が欲しいものではありません。私が欲しいのは、各グループの max enternal_id のレコード全体です。言い換えると

+----+-------------+----------+--------+
| id | external_id | group_id | mypath |
+----+-------------+----------+--------+
|  1 |        1003 |        1 | a      | 
|  3 |        1005 |        2 | c      | 
+----+-------------+----------+--------+

どういうわけか、必要なものをフィルタリングするためにここに max(external_id) ステートメントを入れようとしていますが、これまでのところすべての調査が失敗しています。いくつかのガイダンスをいただければ幸いです。max(external_id) を返すときは、パス列が異なるため、レコード全体が選択されることが重要です。

4

1 に答える 1

19

http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/の多くの情報

これは、MySQL では常に厄介な問題でした。いくつかのフィールドを (external_id で始まる) 連結し、その MAX() を選択して、元に戻すなどの回避策がありました。

派生テーブルを使用することをお勧めします。最初のテーブル (t1) は、 を識別する単純なクエリから派生し、そこからMAX(external_id)結合して残りのデータを取得します。

external_idこれは一意の場合のみです

SELECT 
   t1.group_id, some_table.id, some_table.mypath
FROM 
   (
      SELECT group_id, MAX(external_id) AS external_id
      FROM some_table
      GROUP BY group_id
   ) as t1
INNER JOIN 
   sometable ON t1.external_id = sometable.external_id
WHERE ...
于 2012-10-02T23:23:02.010 に答える