🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
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回答

2488閲覧

SQL テーブル間の結合処理とrank関数

WsFkt75O8rrra53

総合スコア2

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/01/12 04:36

SQL初学者です。
現在PostgreSQLを用いております。

下記の通りテーブルに対して、対象の日付より前3日間の金額を比較してランキングを付与したいです。

日付金額
2012-04-011510
2012-04-021520
2012-04-031525
2012-04-041530
2012-04-051525
2012-04-061510

ランキング付与後

日付金額ランキング
2012-04-0115101
2012-04-0215201
2012-04-0315251
2012-04-0415301
2012-04-0515252
2012-04-0615103

上記のような処理をSQLではどのように書くのでしょうか。
下記クエリを試してみましたがうまくいきませんでした。

select a.日付 ,a.金額 ,rank() over (order by b.金額) as ランキング from table a inner join table b on a.日付>= b.日付 and a.日付- interval '3 day' <= b.日付 group by 1,2;

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

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

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

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

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

guest

回答2

0

PostgreSQLでも使える、PARTITION BY も必要かと。ウィンドウ関数

投稿2021/01/12 04:53

Orlofsky

総合スコア16417

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

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

WsFkt75O8rrra53

2021/01/12 06:02

リンクまで教えていただきありがとうございます!
guest

0

ベストアンサー

何かしらのグループごとにランキングを求めたい場合は、PARTITION BYを利用します。
「ランキング付与後」の結果は、たとえば以下のようなクエリで実現することができます。

sql

1SELECT 2 日付1 AS 日付, 3 金額, 4 ランキング 5FROM ( 6 SELECT 7 a.日付 AS 日付1, 8 a.金額, 9 b.日付 AS 日付2, 10 RANK() OVER (PARTITION BY a.日付 ORDER BY b.金額 DESC) AS ランキング 11 FROM tbl AS a 12 JOIN tbl AS b ON b.日付 BETWEEN (a.日付 - INTERVAL '2 day') AND a.日付 13) AS c 14WHERE 日付1 = 日付2;

投稿2021/01/12 05:44

neko_the_shadow

総合スコア2349

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

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

WsFkt75O8rrra53

2021/01/12 06:02

ありがとうございます!問題解消できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問