0

わかった。TRAVIAN ゲームで使用されるデータから作成されたデータベースがあります。200000 行あるので、Excel 分析用に減らしたいと考えています。

x   y   village player alliance population  date
27 -41  h1      h       S       35          2009-12-23
27 -41  h1      h       S       56          2009-12-24
27 -41  h1      h       S       60          2009-12-25
27 -41  h1      h       S       89          2009-12-26

これらは、表の重要な属性のほんの一部です。プレイヤーがシステムにログインするたびに、各村の他のエントリがたくさんあります。各村ごとに人口が増えていることがわかります。村の最大人口があるエントリのみを返す sql ステートメントを書きたいだけです。(もちろん、村ごとに)。

私はこのようなことを書きました

SELECT * 
FROM x_world
GROUP BY village
HAVING population = max(population)

理論的には、各村をループして、最大の人口エントリを検索し、その 1 つだけを取得したいと考えています。村ごとにやりたい。これで村の総数も出ます。

4

3 に答える 3

1

結合を使用してこのクエリを試してください。従属サブクエリよりもはるかに高速です。

SELECT 
    * 
FROM x_world as xr
INNER JOIN (
        SELECT 
                x,
                MAX(population)
        FROM x_world as xr
        GROUP BY x 
) as xt ON xt.x = xr.x
GROUP BY village

デモ

于 2013-01-05T17:49:18.400 に答える
0
SELECT *
FROM x_world
GROUP BY village
HAVING SUM(population)=
  (SELECT MAX(a.population)
  FROM
    (SELECT village,SUM(population) population FROM x_world GROUP BY village
    ) a
  )

SQL_LIVE_DEMO

于 2013-01-05T17:47:07.717 に答える
0

あなたが望むのは次のようなものです:

select *
from x_world w
where population = (select max(population) from x_world w2 where w2.village = w.village)

注意: 村に複数の最大人口がある場合、これは複数の行を返します。

実際には、これは次のようにして MySQL で修正できます。

select *
from x_world w
where population = (select max(population) from x_world w2 where w2.village = w.village)
group by village

ただし、これは非表示の列を使用するため、列が同じ行から取得されるとは限りませ(実際には同じように見えますが)。

1 行を取得するには、ID があると便利です。あなたの例から、日付はこれで機能し、次のようなクエリが生成されます。

select *
form x_world w join
     (select village, max(population) as maxpop,
             substring_index(group_concat(date_format(date, '%Y%m%d'), ',') as maxdate
      from x_world
     ) wmax
     on w.village = wmax.village and
        w.population = wmax.population and
        date_format(w.date, '%Y%m%d') = wmax.date
于 2013-01-05T17:50:53.237 に答える