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

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

11424閲覧

select文でグループに連番を振るには

an6

総合スコア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に必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

1グッド

0クリップ

投稿2016/10/08 11:55

編集2016/10/08 12:13

PostgreSQL 9.5を使用しています。
以下のようなテーブルがあります。
date, from, to
2016/10/10, tokyo, hokkaido
2016/10/10, osaka, hokkaido
2016/10/10, osaka, tokyo
2016/10/11, osaka, tokyo
2016/10/11, fukuoka, tokyo
2016/10/12, osaka, hokkaido

dateとtoを一括りにして連番を降り、select文で以下のような感じで抜きたいと思っています。
id,date, from, to
1,2016/10/10, tokyo, hokkaido
1,2016/10/10, osaka, hokkaido
2,2016/10/10, osaka, tokyo
3,2016/10/11, osaka, tokyo
3,2016/10/11, fukuoka, tokyo
4,2016/10/12, osaka, hokkaido

どのようなselect文を書けばよいか教えていただけないでしょうか。
分析関数を使って色々と試してみたのですがうまくいきませんでした。
どうぞよろしくお願い致します。

garasya👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/10/08 12:04

PostgreSQL のバージョン等 実行環境(開発環境)の情報を記載してください。
an6

2016/10/08 12:13

ご指摘ありがとうございます、PostgreSQL 9.5を使用しております。
guest

回答2

0

windows 関数を利用して

sql

1SELECT dense_rank() OVER (ORDER BY dateA,toA ASC), * 2FROM tableA 3ORDER BY dateA, toA ASC, fromA DESC;

テーブル定義
create table tableA (dateA date, fromA text, toA text);

ちょと強引ですが、作ってみました。

sql

1create table tableAA (number int,dateA date, fromA text, toA text); 2 3insert into tableAA SELECT dense_rank() OVER (ORDER BY dateA,toA ASC) + max, t1.* FROM tableA t1, (select max(number) max from tableAA) t2 ORDER BY fromA DESC;

投稿2016/10/08 13:44

編集2016/10/10 15:55
A.Ichi

総合スコア4070

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

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

A.Ichi

2016/10/08 14:21

既にdense_rank()を使った回答が有りました。失礼いたしました。
an6

2016/10/10 15:08

とんでもないです、ありがとうございます。 select文でdense_rankを使用した結果をそのまま別のテーブルにinsertする運用を考えております。insert先のテーブルには累積していくイメージです。 一方でselect文で引いてくる元のテーブルは一回一回パージするため、同じようにdense_rankを使用するとinsertしたものと同じ連番が1から採番されてしまいます。 1,2,3でパージした後4,5,6とつながるようにしたいのですが、この場合はdense_rankではない別の方法を利用すべきでしょうか??
A.Ichi

2016/10/10 15:55

一応できますレベルのSQLを作成してみました。
an6

2016/10/22 12:20

日々の仕事が忙しくしばらく趣味のプログラミングから離れてしまい返事がおそくなってしまい申しわけありません。 教えていただいた方法で試しました、できました!! 既存のテーブルの最大値を取ってきて、そこにdense rankを重ねると連番になるのですね。勉強になりました、本当にありがとうございました。
guest

0

ベストアンサー

「分析関数を使って色々と試してみた」の内容が不明なのですが・・・、
例えば以下のようなSQLではいかがですか?

sql

1SELECT DENSE_RANK() OVER(ORDER BY date, 2 "to") AS id, 3 TO_CHAR(date, 'YYYY/MM/DD') AS date, 4 "from" AS from, 5 "to" AS to 6FROM test_table 7ORDER BY id, 8 "from" DESC
iddatefromto
12016/10/10tokyohokkaido
12016/10/10osakahokkaido
22016/10/10osakatokyo
32016/10/11osakatokyo
32016/10/11fukuokatokyo
42016/10/12osakahokkaido

投稿2016/10/08 13:16

q1701

総合スコア274

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

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

an6

2016/10/10 14:58

ありがとうございます、dense_rank()を使用すればよかったのですね。 教えていただいた通りにやったら実現することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問