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

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

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

Prestoは、Facebook社がオープンソースで公開した分散処理基盤。Hive/Impalaと同じ分散SQLエンジンの一つです。それぞれのタスクが同時進行できる計算モデルを使用。中間データをメモリに持つため、タスク間のデータのやりとりが高速であることが特徴です。

SQL

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

Q&A

1回答

2106閲覧

sqlで重複行を抽出したい

hatalike

総合スコア0

Presto

Prestoは、Facebook社がオープンソースで公開した分散処理基盤。Hive/Impalaと同じ分散SQLエンジンの一つです。それぞれのタスクが同時進行できる計算モデルを使用。中間データをメモリに持つため、タスク間のデータのやりとりが高速であることが特徴です。

SQL

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

0グッド

0クリップ

投稿2020/10/31 01:28

編集2020/10/31 01:31

前提・実現したいこと

prestoのsqlで以下の■設定テーブルから重複行を抽出したいと考えています。
■重複判断の条件

  • 空文字とNULLは同じと判断
  • カラム「値1」は入力あり・なしで判断

※条件を全て満たしのが■文字列整形結果テーブルとなります。

まず重複行を抽出するのにsqlで以下文字列整形をwith句で順次行い、

  • 文字列(VACHAR)へ変換
  • 空文字とNULLを'入力なし'文字列に
  • 値1の'入力なし'でない場合は'入力あり'へ変換

 ※optionは1,2と入力値で重複判断を行いたいので入力値のまま残す

その結果(■文字列整形結果テーブル)のカラム「code,option,値1」を文字結合しKEYを生成しこのKEYをGROUP BY key HAVING count(key)>0で重複行を抽出しました。重複行は'bbb-2-入力なし'となる。

知見が低くかなり長いSQLでわかりにくく保守しにくい力業のコードになってしまったのですが、みなさんならどのようなSQLを書くかご助言いただければ幸いです。
よろしくお願いいたします。

■設定テーブル

code(VACHAR)option(int)値1(double)
'aaa'空文字0.5
'bbb'2NULLL
'ccc'NULL空文字
'aaa'10.5
'bbb'2空文字

  ↓
■文字列整形結果テーブル

codeoption値1
'aaa''入力なし''入力あり'
'bbb''2''入力なし'
'ccc''入力なし''入力なし'
'aaa''1''入力あり'
'bbb''2''入力なし'

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

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

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

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

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

Orlofsky

2020/10/31 01:55

同じSQLでもデータベースやそのバージョンによって方言が大きいですから、どのデータベースを使うのかを質問のタグで示したり、質問にバージョンも明記した方が適切なコメントが付き易いです。
hatalike

2020/10/31 06:42 編集

ご助言ありがとうございます! Presto 0.205かHive 0.13となります。 よろしくお願いいたします。
guest

回答1

0

今どきじゃないかもしれませんが、以下のようなSQLはどうでしょうか?

SQL

1select distinct 2 code 3 ,coalesce(nullif(option, ''), '入力なし') 4 ,(if(nullif(cast(1 as varchar), '') is null, '入力なし', '入力あり')) as1 5from 設定テーブル 6

投稿2020/12/05 06:08

jcs502ulf

総合スコア307

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問