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

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

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

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

SQL

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

Q&A

解決済

3回答

13223閲覧

SQLで重複する列データがある場合、最新のものだけを抽出したい

tome0112

総合スコア5

SQL Server

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

SQL

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

1グッド

1クリップ

投稿2020/04/06 02:26

編集2020/04/06 02:58

SQLで重複する列データがある場合、最新有無を確認し、最新のものだけを抽出したいです。
実行したいSQLは、下記のようなテーブル「card」に対して、

テーブル名:card (※最新・・・該当番号の更新があった場合は1になる)

顧客番号番号最新
1123411110
1123411110
1123411111
1123422220
1123433330
2123444440
3123455550
3123455551

重複する番号がある場合、最新のデータのみ抽出したいです。
以下が、SQLを実行して抽出したいデータです。

顧客番号番号最新
1123411111
1123422220
1123433330
2123444440
3123455551

恐れ入りますが、よろしくお願いします。

chestnutforest👍を押しています

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

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

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

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

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

sazi

2020/04/06 02:40

更新有無というのは最新という扱いでは無いのですね。 であれば、複数の更新がある状態で最新とするための条件は何ですか? 単に重複しないようにという事ならgroup by とかdistinct とかだけでいいのですが。
tome0112

2020/04/06 02:46 編集

コメントありがとうございます。 一意の番号に対して、1のフラグが立つのは一つだけになります。 ですので、更新=最新と思っていただいて構いません。 同じ番号が後で追加された場合、もともと存在した番号は0のまま、新たに追加された番号が1になります。同じ番号が後で追加されていない場合、番号は0のままです。ですので、重複しない場合は0でも最新となります。 ご不明な点がございましたら仰ってください!
sazi

2020/04/06 02:53 編集

最新でないものを0には出来ないのですか? 要は、1件の場合には1のデータしかない状態に。
tome0112

2020/04/06 02:54

可能であれば、このデータ構造のまま抽出したいです。 もし難しい場合、重複しないデータを1にして抽出する方法もご教授いただけますと幸いです。 恐れ入りますが、よろしくお願いします。
sazi

2020/04/06 02:54

それから、DBMSは何ですか?MySQL?タグに追加して下さい。
tome0112

2020/04/06 03:19

SQL serverを追加しました。
hihijiji

2020/04/06 03:46

書いてある条件だけだと、平構文で書けちゃうんですけど? あと card のプライマリキーは?
guest

回答3

0

これが分かり易いと思います。
select 顧客番号,番号,max(最新) as 最新 from card group by 顧客番号,番号;

投稿2020/04/13 23:28

sochiai1803

総合スコア8

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

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

sazi

2020/04/13 23:50

番号含めてgroup by すると意味がありませんが。
sochiai1803

2020/04/14 03:03

[SQLを実行して抽出したいデータ]を見ると、顧客番号,番号でユニークになっています。従って、group byのキーは、顧客番号,番号でいいのでは?
sazi

2020/04/14 03:50

失礼しました。 私の方が間違えてましたね。
guest

0

既に回答がついていますので、別案で回答しておきます。

SQL

1select * 2from ( 3 select *, row_number() over(partition by 顧客番号, 番号 order by 最新 desc) as seq 4 from card 5) t1 6where seq=1

投稿2020/04/06 03:56

編集2020/04/14 03:51
sazi

総合スコア25327

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

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

tome0112

2020/04/06 04:43

ありがとうございます。無事にデータが取れました。 SQL作成にあたり、迅速にコメントくださりありがとうございました。 とても参考になりました! こちらも大変分かりやすくベストアンサーにさせていただきたかったのですが。。
guest

0

ベストアンサー

おなじ番号で最新が複数件ないならこれでいけるはずです

SQL

1select * from card as t1 2where not exists(select 1 from card where 番号=t1.番号 and 最新>t1.最新)

投稿2020/04/06 03:44

yambejp

総合スコア116724

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

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

tome0112

2020/04/06 04:42

ありがとうございます。こちらでSQLを回したら無事データが取れました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問