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

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回答

1558閲覧

サブクエリを使わずに一つのクエリで作成した集約関数カラムなどを呼び出せるか

ha_horse

総合スコア20

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グッド

0クリップ

投稿2021/06/11 02:53

以下のクエリを実行した時

sql1

1 2SELECT id, date 3, RANK() OVER(PARTITION BY id ORDER BY date) as ranking 4FROM temp 5

このクエリから更にranking = 2のものだけを取り出したい時

sql2

1SELECT id, date 2, RANK() OVER(PARTITION BY id ORDER BY date) as ranking 3FROM temp 4WHERE ranking = 2

上記のようにサブクエリを使わずに実行できる方法はございますでしょうか。
(実際にはsql2のクエリはエラーを起こすはずです)

ご回答いただけると幸いです。よろしくお願い致します。

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

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

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

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

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

hihijiji

2021/06/11 03:00 編集

View, WITH句, ストアドなどもだめですか?
ha_horse

2021/06/11 03:03

ご質問ありがとうございます。 サブクエリを使わないで出したいのでWITH句などは使わないことを想定しています。
hihijiji

2021/06/11 03:09

SQLの構文上SELECT句は最初に書きますが、評価は最後に行います。 一般的にRANK関数はSELECT句でしか使えないので無理です。
ha_horse

2021/06/11 03:15

ご回答ありがとうございます。 サブクエリ使わないと無理なこと、承知しました。 追加の質問で恐縮なのですが、ORDER BY やGROUP BY などでは作成したカラムを使えるのですがどういった構造になるのでしょうか。 ご存知であればご教授頂きたいです。
hihijiji

2021/06/11 03:17

ごめんなさい ORDER BY などの全体集約句がある場合はそっちが最後ですね。
ha_horse

2021/06/11 03:21

なるほどです!ありがとうございます。 そうなるとSQLでは評価構造は FROM ↓ WHERE ↓ SELECT ↓ 全体集約句 みたいなイメージですかね?
ha_horse

2021/06/11 03:29

非常に助かりました!ありがとうございます!!!
guest

回答2

0

ベストアンサー

RANKを含むWindow関数が利用できるのはSELECTもしくはORDER BYで、WHEREでは利用することはできません。理由についてはPostgreSQLのドキュメントがわかりやすいので抜粋します。

3.5. Window Functions

Window functions are permitted only in the SELECT list and the ORDER BY clause of the query. They are forbidden elsewhere, such as in GROUP BY, HAVING and WHERE clauses. This is because they logically execute after the processing of those clauses.

なお、サブクエリを利用せずに同じことをしたいのであれば、以下のようなクエリになるかと思います。

SQL

1SELECT T1.id, T1.date, COUNT(*) as ranking 2FROM temp T1 3JOIN temp T2 ON T1.id = T2.id AND T1.date <= T2.date 4GROUP BY T1.id, T1.date 5HAVING ranking = 2

投稿2021/06/11 04:07

neko_the_shadow

総合スコア2230

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

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

0

3.5. ウィンドウ関数
にあるサンプルを見ると、普通にサブクエリしているような。

SELECT depname, empno, salary, enroll_date
FROM
(SELECT depname, empno, salary, enroll_date,
rank() OVER (PARTITION BY depname ORDER BY salary DESC, empno) AS pos
FROM empsalary
) AS ss
WHERE pos < 3;

投稿2021/06/11 02:59

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問