2

これと同じ問題が発生しましたMySQLで各グループの最大n値を見つける

私はこのようないくつかのデータを持っています:

+ --------- + ----------- +
| レーン| シリーズ|
+ --------- + ----------- +
| 1 | 680 |
| 1 | 685 |
| 1 | 688 |
| 2 | 666 |
| 2 | 425 |
| 2 | 775 |
+ --------- + ----------- +

そして、レーンごとに最も高いnシリーズを取得したいと思います(この例では2としましょうが、それよりもはるかに多い可能性があります)。したがって、出力は次のようになります。

+ --------- + ----------- +
| レーン| シリーズ|
+ --------- + ----------- +
| 1 | 688 |
| 1 | 685 |
| 2 | 775 |
| 2 | 666 |
+ --------- + ----------- +

「ファンキーな」MySQL機能を備えたSQLは非常に優れていると思います。

set @count:=-1, @lane:=0; 
select lane, series
from (select lane, series from lane_series order by lane, series desc) x
where if(lane != @lane, @count:=-1, 0) is not null
and if(lane != @lane, @lane:=lane, lane) is not null
and (@count:=@count+1) < 2; -- Specify the number of row at top of each group here

驚いたことに、これはMySQL5.0とMySQL5.1で非常にうまく機能しますが、私の実稼働MySQLバージョンであるMySQL5.5では機能しません。

MySQL5.5での結果は次のようになります。

+ --------- + ----------- +
| レーン| シリーズ|
+ --------- + ----------- +
| 1 | 688 |
| 1 | 685 |
+ --------- + ----------- +

MySQL 5.5で動作させるのを手伝ってください。または、結果が異なる理由を教えてください。どうもありがとうございました。

更新:本番データベースには約300万件のレコードがあるため、できるだけ早く結果を取得する方法を知りたいと思います。

4

1 に答える 1

5

これを試してみてください、多分それはあなたのために働くでしょう。

SELECT lane, series
FROM   tableA
WHERE (
        SELECT count(*)
        FROM   tableA AS f
        WHERE  f.lane = tableA.lane AND 
               f.series >= tableA.series
      ) <= 2
ORDER BY lane, series DESC

SQLFiddleデモ

于 2012-09-12T06:05:07.237 に答える