2016-05-09 1 views
2

この質問の複雑さを前もってお詫びしますが、これは私が扱っていることです。私はそれに500万レコード以上のテーブルを持っています。 500万件以上のレコードのうち、Column1と呼ぶもののユニークな値は約185,000です。 Column1はvarcharフィールドです。私は、日付フィールドを '2005-01-01'から現在の日付までの日付フィールドであるColumn2と呼びます。レコードごとに、私はColumn3と呼ぶフロートフィールドがあります。 Column3は、その特定のレコードの現在のレートを保持します。それから私はColumn4と呼ぶ異なるフロートフィールドがあります。このフィールドは、Column3の値がColumn2から取得している前月のものと等しい値に設定する必要がある最後のレートフィールドを保持します。トリッキーな部分は、私がColumn1のユニークな値ごとにこれを行う必要があるということです。私はそれが理にかなったことを願う今はColumn4のすべてのデータがnullですが、私はあなたが以下のように見えるようにしたいと思います。例えば別の列の一意の値ごとに、SQL設定列が前月の別の列と等しくなりました

Column1  Column2  Column3  Column4 
Record1  2005-01-01 6.25   6.25 
Record2  2005-01-01 5.625  5.625 
Record3  2005-01-01 4.75   4.75 

Record1  2005-02-01 6.5   6.25 
Record2  2005-02-01 5.625  5.625 
Record3  2005-02-01 4.75   4.75 

Record1  2005-03-01 6.75   6.5 
Record2  2005-03-01 5.625  5.625 
Record3  2005-03-01 5   4.75 

あなたが見ることができるように、レートがRECORD2と同じように月ごとに同じままの場合があります。しかし、Record1のように頻繁に変更されることもあります。それから、Record3のように一度だけ変わる時があります。あなたの提案をお知らせし、事前に感謝してください。

+0

これはおそらく、あなたが思うよりも簡単です。あなたがいくつかの詳細を提供できるなら、我々は助けることができます。ここから始めましょう。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

Column4の最初の3つの値はNULLでなければならない記録。たとえば、ウィンドウ関数を使用すると、あなたのタスクはかなり簡単です。 'ROW_NUMBER()'。 –

+0

@John Cowles_1つの 'column2'について:常に' yyyy-MM-01'ですか?そうでない場合、 'column2'が' 2005-03-31'または '2005-03-30'、または' 2005-01-02'のとき '' column4'はどうでしょうか? –

答えて

5

あなたは左の自己が、このような前の値を取得するために参加使用することができます。

declare @t table (column1 varchar(10), column2 datetime, column3 float, column4 float) 

insert into @t (column1, column2, column3) 
select 'RecordA', '2005-01-01', 6.25 union all 
select 'RecordB', '2005-01-01', 5.625 union all 
select 'RecordC', '2005-01-01', 4.75 union all 
select 'RecordA', '2005-02-01', 6.5 union all 
select 'RecordB', '2005-02-01', 5.625 union all 
select 'RecordC', '2005-02-01', 4.75 union all 
select 'RecordA', '2005-03-01', 6.75 union all 
select 'RecordB', '2005-03-01', 5.625 union all 
select 'RecordC', '2005-03-01', 5 

update cur 
set column4 = pre.column3 
from @t as cur 
left join @t as pre on 
    cur.column1 = pre.column1 and 
    dateadd(mm, -1, cur.column2) = pre.column2 


select * 
from @t 
order by column2, column1 
+0

これは私の初めてのスタックオーバーフローの投稿ですので、私と一緒に負担してください...あなたのコードをコピーして貼り付け、に。私が経験している問題は、185,000のユニークなレコードがあるということです。 RecordA、RecordB、RecordCだけではありません。RecordD、RecordE、RecordFなどもあります。別の命名規則を指定した方が意味があります。これらのレコードは、Record1、Record2、およびRecord3と考えることができます。最後のレコードはRecord185000です。各レコードのこれらの値をすべてハードコアすることはできません。この追加情報は役に立ちますか? –

+0

@JohnCowles - 私はサンプルデータを使ってサンプルを投稿していました。あなたがする必要があるのは 'update'で始まるコードを使用し、' @ t'をあなたの実際のテーブル名 – Aducci

+0

と置き換えて混乱させてしまいます。私はあなたが言ったことをし、私はそれが働いたと信じています。私の最後にはまだいくつかの検証をするつもりですが、私はあなたが頭痛を解決したと思います。どうもありがとうございました! –

関連する問題