こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SQL文 特定のレコードを抽出したい

以下のようなテーブルAがあったとします。
年月日,項目B
----------------------
20080101 100
20080102 100
20080103 200
20080104 400
20080105 400
20080106 200

SQL文にて、データの抽出を行いたいのですが、
抽出したいのは、データに変更があった年月日と項目Bの値です。

年月日,項目B
----------------------
20080101 100
20080103 200
20080104 400
20080106 200

前の年月日と比較し、項目Bに違いがあった場合のデータだけ抽出したいのですが、SQL文で行うことは可能でしょうか??

環境は、SQL Server 2005 です。

投稿日時 - 2008-01-19 15:52:52

QNo.3693934

すぐに回答ほしいです

質問者が選んだベストアンサー

>「前の年月日と比較し、項目Bに違いがあった場合」です。
>例えば、前レコードの項目Bが「100」で、次レコードにおいて項目Bが「200」になっていれば、その年月日と項目Bの値を抽出したいのです。
>次レコードでも、項目Bが「100」の場合は、抽出しません。

なるほど!理解しました!!!
私の知っている限りになりますが、SQLでは無理なので、
下記のようなT-SQLを書かない限り無理そうです。

/////////////////////////////////////////////////////////

-- 初期化
SET NOCOUNT ON

-- 結果保存ワークテーブル
-- テーブルAの型に対する説明がなかったのでintにしました
DECLARE @t TABLE([年月日] int, [項目B] int)

/************************************************
変数定義
***********************************************/
-- テーブルAの型に対する説明がなかったのでintにしました
DECLARE @b_年月日 int
DECLARE @n_年月日 int
DECLARE @b_項目B int
DECLARE @n_項目B int
DECLARE @cnt int

SET @cnt = 0

-- テーブルAを読み込むカーソル
DECLARE テーブルA_cur CURSOR FOR
SELECT [年月日], [項目B] FROM [テーブルA]
ORDER BY [年月日] ASC

OPEN テーブルA_cur

FETCH NEXT FROM テーブルA_cur
 INTO @b_年月日, @b_項目B

WHILE @@FETCH_STATUS = 0
BEGIN
-- レコードの一番先頭は、基準値として抽出対象にする
  IF @cnt = 0
  BEGIN
    -- レコードの一番先頭は、基準値として抽出対象にする
    -- (結果ワークテーブルに保存)
    INSERT INTO @t values(@b_年月日, @b_項目B)
  END

  FETCH NEXT FROM テーブルA_cur
   INTO @n_年月日, @n_項目B

  -- 前レコードとの値比較
  IF @b_項目B <> @n_項目B
  BEGIN
    -- 値が違ったので結果ワークテーブルに保存
    INSERT INTO @t values(@n_年月日, @n_項目B)

    -- 次のレコードとの比較に使用するため値をバックアップ 
    SET @b_年月日 = @n_年月日
    SET @b_項目B = @n_項目B
  END

  -- ループカウンタインクリメント
  SET @cnt = @cnt + 1

END

CLOSE テーブルA_cur
DEALLOCATE テーブルA_cur

-- 抽出結果表示
SELECT * FROM @t

/////////////////////////////////////////////////////////

上記のT-SQL実行結果
20080101100
20080103200
20080104400
20080106200

もし、このT-SQLを*.sqlファイルに保存して毎回使用するか、
または何かのプログラムからこのSQLを呼びたい場合は、
上記コードをストアドプロシージャーにしても良いと思います。

そうすれば、ご希望のものが抽出できます。
いろいろと頂いた条件を元に確認はしてるので、ご希望通りの
結果にはなるとは思いますが、結論としては、単純なSQLでは
少々厳しいのかなと思います。
(一応、上記T-SQLは、SQL Server2005で確認しました)

ご参考になれば幸いです。

投稿日時 - 2008-01-24 21:34:47

お礼

ストアドプロシージャーで試して、確認できました。
良い勉強になりました。

本当にどうもありがとうございました!!

投稿日時 - 2008-01-26 09:40:46

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

このテーブルAには、更新日や更新者など更新情報がわかる
項目を付与していないのでしょうか?
もしくは、テーブルAが更新された際に、トリガなどを使って、
別の更新履歴テーブルに更新情報を管理されていないのでしょうか?

更新を管理する項目かテーブルがまったくなければ、
「データ変更があったデータ」は、「何を」もって抽出したら
良いか判断ができませんので、上記の情報だけで考えると、
「できない」というのが回答になります。

もし、更新情報を保持する項目か、更新履歴テーブルのような
ものがあれば、その項目とテーブルレイアウトを補足
頂けますか?よろしくお願いします。

投稿日時 - 2008-01-21 18:13:05

補足

ご回答ありがとうございます。
すみません。書き方が悪かったです。
まず、更新情報等のデータはありません。

>「データ変更があったデータ」は、「何を」もって抽出したら

この「何を」は、
「前の年月日と比較し、項目Bに違いがあった場合」です。
例えば、前レコードの項目Bが「100」で、次レコードにおいて項目Bが「200」になっていれば、その年月日と項目Bの値を抽出したいのです。
次レコードでも、項目Bが「100」の場合は、抽出しません。

説明が下手で申し訳ないのですが、伝わりますでしょうか?

投稿日時 - 2008-01-24 11:29:48

あなたにオススメの質問