私は以下のようなテーブル構造を持っています。私ができるようにしたいのは、各会社コードの値が最も高い上位 3 つのレコードを取得することです。
私はグーグルで検索しましたが、より良い方法が見つからなかったので、皆さんが私を助けてくれることを願っています.
ちなみに、MySQL と SAP HANA で試しています。しかし、MySQL のみのヘルプが得られる場合は、HANA のクエリで「構造」を取得できることを願っています。
どうもありがとう!
ここにテーブルがあります:
私は以下のようなテーブル構造を持っています。私ができるようにしたいのは、各会社コードの値が最も高い上位 3 つのレコードを取得することです。
私はグーグルで検索しましたが、より良い方法が見つからなかったので、皆さんが私を助けてくれることを願っています.
ちなみに、MySQL と SAP HANA で試しています。しかし、MySQL のみのヘルプが得られる場合は、HANA のクエリで「構造」を取得できることを願っています。
どうもありがとう!
ここにテーブルがあります:
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でも機能すると思います