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

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

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

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

SQL

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

Transact-SQL

Transact-SQLはSybase ASEとMIcrosoft SQLサーバで対応されているSQLの機能拡張版です。

Q&A

解決済

2回答

696閲覧

sql でグルーピングしてその数が2位上だったらその行を削除するというコード

kotodama

総合スコア33

SQL Server

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

SQL

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

Transact-SQL

Transact-SQLはSybase ASEとMIcrosoft SQLサーバで対応されているSQLの機能拡張版です。

0グッド

0クリップ

投稿2020/06/23 07:47

お世話になります。
下記の実装ができず悩んでおります。

環境:SQL Server 2019
言語:SQL

テーブル名: M_T

ID, name, ID2, ID3 <= カラム 1 , aaa , 1 , 2 2 , bbb , 1 , 3 3 , ccc , 2 , 2 4 , ddd, 1 , 3 ↑ 行

上記のようなテーブルがあった場合に、

ID3 でグルーピングを実施して、そのとき、 ID2 が 1より上(1 < n) だった場合にその行を削除するSQLが思いつかずなやんでおります。

SELECT COUNT(ID2) FROM M_T GROUP BY ID3 HAVING COUNT(ID2) > 1;

と SELECT 文ならかけそうなのですが、これを DELETE でどのように書いたらいいのかがわかりません。。。
どなたかご教示をお願い致します。

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

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

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

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

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

sazi

2020/06/23 08:18 編集

削除条件として > ID2 が 1より上(1 < n) に対してID3のグルーピングを付加する意味はなんですか? →ID3ごとの最小のID2のデータを残すって事? 「ID2 の順位が 1より上(1 < n)」という意味ですか?
kotodama

2020/06/23 08:53

ID3でグルーピングしたときに、ID2の要素が複数ある場合には全て削除したいという感じです。。。
guest

回答2

0

sql

1SELECT COUNT(ID2) FROM M_T GROUP BY ID3 HAVING COUNT(ID2) > 1;

「ID2の『要素』が複数」っていうのがちょっと謎。
『要素』が『データの種類』って意味なら上の文は間違いなので理解のしにくさに拍車をかける。
『要素』が『行の数』って意味ならID2の値は全く関係ないため…コレガワカラナイ

上の文だとID3が2でも3でもcount(ID2)は2(行)です。
つまりサンプルデータでは「HAVING COUNT(ID2) > 1」は1行も絞れてない。

sql

1; with M_T(ID, name, ID2, ID3) as ( 2 select 1 , 'aaa' , 1 , 2 3 union all select 2 , 'bbb' , 1 , 3 4 union all select 3 , 'ccc' , 2 , 2 5 union all select 4 , 'ddd', 1 , 3 6) 7SELECT ID3 8 ,COUNT(ID2) as 行数 9FROM M_T 10GROUP BY ID3 11HAVING COUNT(ID2) > 1; 12 13/* 14ID3 行数 15----------- ----------- 162 2 173 2 18 19(2 行処理されました) 20*/

countはdistinct中に入れないと『データの種類』にはならない。

sql

1; with M_T(ID, name, ID2, ID3) as ( 2 select 1 , 'aaa' , 1 , 2 3 union all select 2 , 'bbb' , 1 , 3 4 union all select 3 , 'ccc' , 2 , 2 5 union all select 4 , 'ddd', 1 , 3 6) 7SELECT ID3 8 ,COUNT(distinct ID2) as 行数 9FROM M_T 10GROUP BY ID3 11HAVING COUNT(distinct ID2) > 1; 12 13/* 14ID3 行数 15----------- ----------- 162 2 17 18(1 行処理されました) 19*/

ID3さえ取れればsazi氏と同じでwhere ID3 in (select ID3 ~)で消せばok

投稿2020/06/23 11:48

sousuke

総合スコア3830

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

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

kotodama

2020/06/26 02:14

ご丁寧に回答して頂きましてありがとうございます。
guest

0

ベストアンサー

SQL

1delete from M_T 2where ID3 in ( 3 select ID3 from M_T group by ID3 having count(*) > 1 4 )

件数=要素数 ではなく、要素数での判断なら、

SQL

1delete from M_T 2where ID3 in ( 3 select ID3 from M_T group by ID3 having count(DISTINCT ID2) > 1 4 )

投稿2020/06/23 09:57

編集2020/06/23 13:45
sazi

総合スコア25327

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

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

kotodama

2020/06/26 02:14

ご回答ありがとうございました。 2つ目の実装でうまくいきました! 助かりました!! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問