- - PR -
重複データの取得方法について。
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 | ||||||||
|
投稿日時: 2008-08-07 22:13
自己結合して一つ前の連番が存在しないか、データ数が異なる場合に取得する。
でできそうです。 | ||||||||
|
投稿日時: 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 ------------------------------------------------------------------ ****************************************************************** 自己結合、というとこのような形を想像しているのですが…。 ご説明頂いた条件をどう当てはめて良いのかが理解できていません。 もう少し、詳しいご説明をいただけませんでしょうか? よろしくお願いいたします! | ||||||||
|
投稿日時: 2008-08-08 11:16
> Table1.ID = Table2.ID and Table1.連番 - 1 = Table2.連番
で自己結合すると、以下のようになります。
| ||||||||
|
投稿日時: 2008-08-08 11:35
目的がよく分かりませんが、「まとめる」という意味がグルーピングということでしたら、
でよいと思います。 なお、SQL での操作はあくまでもリレーショナルなデーター操作までにとどめるべきだと考えますので、「まとめる」が複雑な画面の表示のため、という感じのことでしたら、これより凝ったようなことは SQL ではやらないほうがよいと思います。 (今回の場合は、たとえば distinct も使えるかもしれませんが、group by よりもリレーショナルな操作から外れる度合いが大きくなります。) | ||||||||
|
投稿日時: 2008-08-08 17:45
unibonさんの方法だと
連番5も括られてしまいますね。 [追記] こあらさんの方法で、 3行目のデータを除くSQLを書けばいけるんじゃないかと思います。 [ メッセージ編集済み 編集者: KOX 編集日時 2008-08-08 17:49 ] | ||||||||
|
投稿日時: 2008-08-08 18:00
連番5があったのですね。見落としていました。だから自己結合が登場しているのですね。 消極的な意見ですが、連番という列について、レコードAとレコードBの相対的な関係を調べるということはもはや集合理論の枠を超えています。「Database Expert」という会議室なので、SQL のテクニックとしては大いにありだとは思いますが、私だったら SQL を発行した後のアプリケーションの側でキーブレークなどのやりかたで重複を排除します。 | ||||||||
|
投稿日時: 2008-08-09 23:21
みなさま、こんばんは。
沢山のお知恵をありがとうございます!! 現状ではこあら様の方法、自己結合にて思い通りのデータが取得できました。 本当に助かりました…! **こあら様 自己結合の詳細をありがとうございました! 結合条件が見出せず、お手数おかけしてしまい申し訳ありませんでした。 思い通りのデータが取得でき、本当に助かりました!ありがとうございました! **unibon様 SQL以外のお知恵も頂けて勉強になります! テーブルに存在するレコード数が70万件ほどあるので、 それをアプリケーション側で排除しようと思うと、時間がかかりそうに思いまして。 できる限り取得データを少なくする方法を見つけたかったのです。 様々なアドバイスありがとうございました! **KOX様 詳細条件まで御教授くださりありがとうございました! 現状は思い通りのデータを取得できています。 皆さまありがとうございました! また、今後もお尋ねすることがあるとは思いますが、よろしくお願い致します! |