- PR -

重複データの取得方法について。

投稿者投稿内容
ひめりんご
会議室デビュー日: 2008/08/07
投稿数: 3
投稿日時: 2008-08-07 20:54
皆さまこんばんは。
SQLでのデータの取得について、どうかお知恵をお貸しください。

下記のようなテーブルがあるとします。
---------------------------------
ID  |(連番) |データ数    
---------------------------------
1  | 1   |100
---------------------------------
1  | 2   |200
---------------------------------
1  | 3   |200
---------------------------------
1  | 4   |500
---------------------------------
1  | 5   |200
---------------------------------

********************************
この場合で、連番2、3のみ一つにまとめる、ということは可能でしょうか?
(※:「連番」は取得しません。)
同一のデータ数が連続した場合のみ一つにまとめて取得したいのですが…

調べ方が足りないのか、探せども中々見つからずでして。
せめてヒントとなりそうなものなどございましたら、
是非、教えて頂きたいです。
よろしくお願い致します!!


------------------------------
開発環境:
WindowsXP / SQL Server 2005 Express Edition
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2008-08-07 22:13
自己結合して一つ前の連番が存在しないか、データ数が異なる場合に取得する。
でできそうです。
ひめりんご
会議室デビュー日: 2008/08/07
投稿数: 3
投稿日時: 2008-08-08 11:03
こあら様。早々の返信ありがとうございます。

申し訳ございませんが、自己結合した状態が想像できず、
仰る内容が理解できていません。

自己結合した場合、例のテーブルは下記のような形になるのでしょうか?
*******************************************************
Table1              Table2
------------------------------------------------------------------
ID  |(連番) |データ数 | ID  |(連番) |データ数    
------------------------------------------------------------------
1  | 1   |100     | 1  | 1    |100
------------------------------------------------------------------
1  | 2   |200     | 1  | 2    |200    
------------------------------------------------------------------
1  | 3   |200     | 1  | 3    |200    
------------------------------------------------------------------
1  | 4   |500     | 1  | 4    |500    
------------------------------------------------------------------
1  | 5   |200     | 1  | 5    |200    
------------------------------------------------------------------
******************************************************************
自己結合、というとこのような形を想像しているのですが…。
ご説明頂いた条件をどう当てはめて良いのかが理解できていません。

もう少し、詳しいご説明をいただけませんでしょうか?
よろしくお願いいたします!
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2008-08-08 11:16
> Table1.ID = Table2.ID and Table1.連番 - 1 = Table2.連番
で自己結合すると、以下のようになります。

コード:
Table1            Table2
------------------------------------------------------------------
ID  |(連番)|データ数 | ID  |(連番) |データ数
------------------------------------------------------------------
1  | 1  |100    |null
------------------------------------------------------------------
1  | 2  |200    | 1  | 1   |100
------------------------------------------------------------------
1  | 3  |200    | 1  | 2   |200
------------------------------------------------------------------
1  | 4  |500    | 1  | 3   |200
------------------------------------------------------------------
1  | 5  |200    | 1  | 4   |500
------------------------------------------------------------------

unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-08-08 11:35
引用:

ひめりんごさんの書き込み (2008-08-07 20:54) より:
皆さまこんばんは。
SQLでのデータの取得について、どうかお知恵をお貸しください。

下記のようなテーブルがあるとします。
---------------------------------
ID  |(連番) |データ数    
---------------------------------
1  | 1   |100
---------------------------------
1  | 2   |200
---------------------------------
1  | 3   |200
---------------------------------
1  | 4   |500
---------------------------------
1  | 5   |200
---------------------------------

********************************
この場合で、連番2、3のみ一つにまとめる、ということは可能でしょうか?
(※:「連番」は取得しません。)
同一のデータ数が連続した場合のみ一つにまとめて取得したいのですが…


目的がよく分かりませんが、「まとめる」という意味がグルーピングということでしたら、
コード:
select ID, データ数 from テーブル group by ID, データ数


でよいと思います。

なお、SQL での操作はあくまでもリレーショナルなデーター操作までにとどめるべきだと考えますので、「まとめる」が複雑な画面の表示のため、という感じのことでしたら、これより凝ったようなことは SQL ではやらないほうがよいと思います。
(今回の場合は、たとえば distinct も使えるかもしれませんが、group by よりもリレーショナルな操作から外れる度合いが大きくなります。)
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2008-08-08 17:45
unibonさんの方法だと
連番5も括られてしまいますね。

[追記]
こあらさんの方法で、
3行目のデータを除くSQLを書けばいけるんじゃないかと思います。

[ メッセージ編集済み 編集者: KOX 編集日時 2008-08-08 17:49 ]
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-08-08 18:00
引用:

KOXさんの書き込み (2008-08-08 17:45) より:
unibonさんの方法だと
連番5も括られてしまいますね。


連番5があったのですね。見落としていました。だから自己結合が登場しているのですね。

消極的な意見ですが、連番という列について、レコードAとレコードBの相対的な関係を調べるということはもはや集合理論の枠を超えています。「Database Expert」という会議室なので、SQL のテクニックとしては大いにありだとは思いますが、私だったら SQL を発行した後のアプリケーションの側でキーブレークなどのやりかたで重複を排除します。
ひめりんご
会議室デビュー日: 2008/08/07
投稿数: 3
投稿日時: 2008-08-09 23:21
みなさま、こんばんは。
沢山のお知恵をありがとうございます!!

現状ではこあら様の方法、自己結合にて思い通りのデータが取得できました。
本当に助かりました…!

**こあら様
自己結合の詳細をありがとうございました!
結合条件が見出せず、お手数おかけしてしまい申し訳ありませんでした。
思い通りのデータが取得でき、本当に助かりました!ありがとうございました!

**unibon様
SQL以外のお知恵も頂けて勉強になります!
テーブルに存在するレコード数が70万件ほどあるので、
それをアプリケーション側で排除しようと思うと、時間がかかりそうに思いまして。
できる限り取得データを少なくする方法を見つけたかったのです。
様々なアドバイスありがとうございました!

**KOX様
詳細条件まで御教授くださりありがとうございました!
現状は思い通りのデータを取得できています。

皆さまありがとうございました!
また、今後もお尋ねすることがあるとは思いますが、よろしくお願い致します!

スキルアップ/キャリアアップ(JOB@IT)