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

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

新規登録して質問してみよう
ただいま回答率
85.35%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

3498閲覧

row_numberのようにグループ単位で同じ番号を振りたい(ソート)

退会済みユーザー

退会済みユーザー

総合スコア0

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2021/05/27 11:28

編集2021/05/27 11:31

tblAが以下のようにあったとします。
|コード|詳細コード|名前|ペアid|
|:--|:--:|--:|
|1|1-1|aaa|2|
|1|1-2|bbb|2|
|1|1-3|ccc|2|
|1|1-4|ddd|1|
|1|1-5|eee|2|
|2|2-1|fff|2|

これを以下のようにソートしたいです。

|コード|詳細コード|名前|ペアid|
|:--|:--:|--:|
|1|1-1|aaa|2|
|1|1-2|bbb|2|
|1|1-3|ccc|2|
|1|1-5|eee|2|
|2|2-1|fff|2|
|1|1-4|ddd|1|

「ORDER BY コード,詳細コード」が基本で、「ペアid」が同じものはその下につなげるといった形です。

調べました感じ一番近いのが、「ROW_NUMBER() over(PARTITION ペアid order by コード,詳細コード)」で
|コード|詳細コード|名前|ペアid|ROW|
|:--|:--:|--:|
|1|1-1|aaa|2|1|
|1|1-2|bbb|2|2|
|1|1-3|ccc|2|3|
|1|1-4|ddd|1|1|
|1|1-5|eee|2|4|
|2|2-1|fff|2|5|

になるかと思いますが、これを
|コード|詳細コード|名前|ペアid|ROW|
|:--|:--:|--:|
|1|1-1|aaa|2|1|
|1|1-2|bbb|2|1|
|1|1-3|ccc|2|1|
|1|1-4|ddd|1|2|
|1|1-5|eee|2|1|
|2|2-1|fff|2|1|

のように出来れば解決できるかと思いました。
(order by ROWで解決)

SQL Serverを用いておりますが、UI側のvb.netでの処理でも構いません。
また、実際には様々な結合の結果持ってきたtblAですので、自身を結合するといった処理は重くなるので現実的ではありません。
DENSE_RANK() over (order by ペアid)も近いのですが、
|コード|詳細コード|名前|ペアid|DENSE|
|:--|:--:|--:|
|1|1-1|aaa|2|2|
|1|1-2|bbb|2|2|
|1|1-3|ccc|2|2|
|1|1-4|ddd|1|1|
|1|1-5|eee|2|2|
|2|2-1|fff|2|2|

の様になり、このテーブル上ならDESCで良いのですが、実際には量も多いのでできません。
order by コード,詳細コードで並べた間に同ペアidを挿入といった感じです。

また、ペアidの実際の値は外からはわからないです。(case 2 thenのようにはできない)

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

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

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

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

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

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

sazi

2021/05/27 13:54 編集

> 実際には様々な結合の結果持ってきたtblAですので、自身を結合するといった処理は重くなるので現実的ではありません。 結局並べ替えできても、重かったら使えないって事なんですよね。 だったら、結合の結果からソート順を作り出さなくても、結合の過程で作り出せるかもしれないので、「様々な結合の結果」の部分も明示した方が良いと思うんですが。
退会済みユーザー

退会済みユーザー

2021/05/27 22:55

VB.NET はこの質問には関係無さそうですが、そうであればタグは削除願います。(タグで見ている人にはノイズになって迷惑ですので)
guest

回答1

0

ベストアンサー

かなり要件が複雑そうで、うまく言語化できているか自信がないのですが、やりたいことというのは以下の通りであっていますか?

  1. 同じペアidを持つグループが複数あるので、そのグループレベルで並び替える。グループ同士の順番の付け方は次の通り:
    1.1. グループの中で、ORDER BY コード, 詳細コードを行って、先頭になるものをピックアップする
    1.2. ピックアップされたものをそのグループの代表として、より小さいものを持っているグループから先に並べる
  2. 同じペアidを持つグループの中ではコードと詳細コードの昇順で並べ替える。

あっていれば、おおよそ以下のようなクエリで実現できるかと思います。

SQL

1SELECT * 2FROM ( 3 SELECT 4 *, 5 FIRST_VALUE(コード) OVER (PARTITION BY ペアid ORDER BY コード, 詳細コード) AS 最小_コード, 6 FIRST_VALUE(詳細コード) OVER (PARTITION BY ペアid ORDER BY コード, 詳細コード) AS 最小_詳細コード 7 FROM tblA 8) A 9ORDER BY RANK() OVER (ORDER BY 最小_コード, 最小_詳細コード), コード, 詳細コード

投稿2021/05/27 12:47

neko_the_shadow

総合スコア2349

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問