質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

12663閲覧

SQLで特定の列の上位3件のデータを取得したい

jess2pg

総合スコア14

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

2クリップ

投稿2017/03/14 06:08

環境:PostgreSQL 9.6

商品ごとに対して値段を高い順番に並べ、上位3件を取得したいです。

以下のデータに対して、
商品 値段
A 100
A 80
A 130
A 110
A 50
B 70
B 80
B 90
B 140
B 60
以下のデータを取得したいです。
商品 値段
A 130
A 110
A 100
B 140
B 90
B 80
または、
商品 値段1 値段2 値段3
A 130 110 100
B 140 90 80

例としては2商品で5件づつしかないですが、
実際は何百商品に対して、100件以上あります。

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2017/03/14 06:16

商品と値段の組み合わせはユニークが確保されているのでしょうか?もしそうでない場合は同順位の処理が必要です。また商品はかならず3つ以上存在するのでしょうか?最終的にソート順は商品名(ASC)、値段(DESC)?
jess2pg

2017/03/14 06:25

商品と値段の組み合わせはユニークではありませんが、4件以上取得出来ても問題ありません。今のところ商品は3つ以上存在しますが、2つ以下だったとしても問題無く行いたいと思います。ソート順はご指摘の通りです。
guest

回答2

0

ベストアンサー

Window関数(分析関数)を使用するとシンプルに実現できます。Window関数ではPARTITION BYで指定したグループごとに順序づけや集約関数の適用を行うことができます。GROUP BYとは異なり結果行そのものは集約せずに取り出すことが可能です。

sql

1SELECT 2 * 3FROM 4 ( 5 SELECT 6 shouhin 7 ,nedan 8 ,RANK() OVER (PARTITION BY shouhin ORDER BY nedan DESC) AS junban 9 FROM 10 table01 11 ) 12WHERE 13 junban <= 3 14ORDER BY 15 shouhin 16 ,junban

このSQLでは同順位があると4件以上出力される場合があります。ちょうど3件ずつにしたい場合はRANK()をROW_NUMBER()に変更してください。

3.5. ウィンドウ関数

投稿2017/03/14 07:23

編集2017/03/14 08:01
SVC34

総合スコア1149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jess2pg

2017/03/14 08:21

ありがとうございました。自分のイメージ通りに出来ました。自分なりに色々とSQLを作っていたのですが、複雑なうえに遅いため困っていました。
guest

0

一般的な処理だとこんか感じでもいけるかもしれませんね

SQL

1select * 2from tbl as t1 3having ( 4select count(*)+1 from tbl as t2 5where t1.商品=t2.商品 and t1.値段<t2.値段)<=3 6order by 商品 asc,値段 desc 7

投稿2017/03/14 08:21

yambejp

総合スコア114814

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問