0

私は以下のようなテーブル構造を持っています。私ができるようにしたいのは、各会社コードの値が最も高い上位 3 つのレコードを取得することです。

私はグーグルで検索しましたが、より良い方法が見つからなかったので、皆さんが私を助けてくれることを願っています.

ちなみに、MySQL と SAP HANA で試しています。しかし、MySQL のみのヘルプが得られる場合は、HANA のクエリで「構造」を取得できることを願っています。

どうもありがとう!

ここにテーブルがあります:

http://pastebin.com/xgzCgpKL

4

1 に答える 1

1

MySQLでできること

ROW_NUMBER()分析関数をエミュレートする関係に関係なく、グループ (会社) ごとに正確に 3 つのレコードを取得します。同じ値を持つレコードは同じランクになります。

SELECT company, plant, value
  FROM
(
  SELECT company, plant, value, @n := IF(@g = company, @n + 1, 1) rnum, @g := company
    FROM table1 CROSS JOIN (SELECT @n := 0, @g := NULL) i
   ORDER BY company, value DESC, plant
) q
 WHERE rnum <= 3;

出力:

| | 会社 | 植物 | 値 |
|---------|-------|-------|
| | 1 | シー | 5 |
| | 1 | ビ | 4 |
| | 1 | あ | 3 |
| | 2 | ガ | 6 |
| | 2 | シー | 5 |
| | 2 | D | 3 |
| | 3 | え | 8 |
| | 3 | あ | 7 |
| | 3 | ビ | 3 |

DENSE_RANK()分析関数をエミュレートする 1 から 3 までのランクを持つグループごとのすべてのレコードを取得します

SELECT company, plant, value
  FROM
(
  SELECT company, plant, value, @n := IF(@g = company, IF(@v = value, @n, @n + 1), 1) rnum, @g := company, @v := value
    FROM table1 CROSS JOIN (SELECT @n := 0, @g := NULL, @v := NULL) i
   ORDER BY company, value DESC, plant
) q
 WHERE rnum <= 3;

出力:

| | 会社 | 植物 | 値 |
|---------|-------|-------|
| | 1 | シー | 5 |
| | 1 | ビ | 4 |
| | 1 | あ | 3 |
| | 1 | え | 3 |
| | 1 | ガ | 3 |
| | 2 | ガ | 6 |
| | 2 | シー | 5 |
| | 2 | D | 3 |
| | 3 | え | 8 |
| | 3 | あ | 7 |
| | 3 | ビ | 3 |
| | 3 | ガ | 3 |

これがSQLFiddleのデモです


更新: HANAが分析関数をサポートしているように見えるので、クエリは次のようになります。

SELECT company, plant, value
  FROM
(
  SELECT company, plant, value, 
         ROW_NUMBER() OVER (PARTITION BY company ORDER BY value DESC) rnum
    FROM table1
) 
 WHERE rnum <= 3;

SELECT company, plant, value
  FROM
(
  SELECT company, plant, value, 
         DENSE_RANK() OVER (PARTITION BY company ORDER BY value DESC) rank
    FROM table1
) 
 WHERE rank <= 3;

これはSQLFiddleデモです。これはOracle用ですが、HANAでも機能すると思います

于 2013-10-02T05:14:17.503 に答える