2017-10-31 16 views
0

私はclaimstableを次のように持っています。SQL Serverで変数を作成するSelectステートメントの内部結合

Time    Terminal_ID Claims Count 
------------------------------------------- 
2017-10-19 06:03:00  1  451  1 
2017-10-19 06:04:00  1  452  2 
2017-10-19 06:05:00  1  452.3  2 
2017-10-19 06:06:00  1  458  2 
2017-10-19 06:03:00  9  459  6 
2017-10-19 06:04:00  9  461.2  5 
2017-10-19 06:05:00  9  462  2 
2017-10-19 06:06:00  9  463  1 

私はtimeclaimを選択して、私のテーブルから新しいカラムClaims_Changeを作成します。その後、私はそれを一時テーブルに挿入します。

私の予想出力は次のようになります。

  Time  Terminal_ID Claims Count Claims_change 
    --------------------------------------------------------- 
    2017-10-19 06:03:00  1  451  1  Null 
    2017-10-19 06:04:00  1  452  2  1 
    2017-10-19 06:05:00  1  452.3  2  0.3 
    2017-10-19 06:06:00  1  458  2  5.7 
    2017-10-19 06:03:00  9  459  6  Null 
    2017-10-19 06:04:00  9  461.2  5  2.2 
    2017-10-19 06:05:00  9  462  2  0.8 
    2017-10-19 06:06:00  9  463  1  1 

これは私のクエリです:

select 
    [Time], Terminal_ID, Claims, 
    convert(decimal(12, 3), y.[Claims] - (select t1.[Claims] 
              from claimstable t1 
              where t1.Terminal_ID = y.Terminal_ID 
              and t1.[Time] = (select max([Time]) 
                  from claimstable t2 
                  where t2.Terminal_ID = t1.Terminal_ID 
                   and t2.[Time] < y.[Time]) 
        )) as Claims_change 
into 
    #temptable 
from 
    claimstable as y 

私は5000行のためにこれをテストしたとき、私は100,000行でこれをテストするとき、それは、しかし、正常に動作します、私は、このようなエラーが出る

メッセージ512、レベル16、状態1、行42
Subqu 1つ以上の値を返しました。 =、!=、<、< =、>、> =、またはサブクエリが式として使用されている場合は、これは許可されません。

私はposts一部の古いを読んでいた、推奨される答えはinner joinを使用していました。

また、私の場合、正確に書く方法を知らないのでClaims_changeという変数をinner joinを使って取得します。

ご協力いただければ幸いです。

+0

期待される出力も表示できますか? –

+2

数値から結果セットを減算しようとしています。その結果セットが複数の値を返した場合、SQL Serverは実際に何を行うかを知りません。たとえば、3 - (1、4、6)とは何ですか?複数の行を返す場合は、正確な要件を指定して質問に追加情報を追加する必要があります。それ以外の場合は、なぜ複数の行を取得しているのか、ビジネスルールによって1行に絞り込むのかを理解する必要があります。 –

+0

@TomH、あなたは正しい、あなたのコメントの後、私は少しデータを掘り起こし、私は何とか重複したレコードを持っていることがわかりました。私はそれを見つけてそれを修正しました。素晴らしいコメントに感謝します:) –

答えて

1

これを試すことができます。

select 
    [Time], Terminal_ID, y.Claims, convert(decimal(12,3), y.[Claims]- t2.[Claims]) as Claims_change 
into 
    #temptable 
from 
    claimstable as y 
    OUTER APPLY (SELECT TOP 1 t1.[Claims] FROM claimstable t1 where 
      t1.Terminal_ID = y.Terminal_ID AND y.[Time] > t1.[Time] ORDER BY [Time] DESC) as t2 

結果:

Time     Terminal_ID Claims  Claims_change 
----------------------- ----------- ------------ --------------- 
2017-10-19 06:03:00.000 1   451.00  NULL 
2017-10-19 06:04:00.000 1   452.00  1.000 
2017-10-19 06:05:00.000 1   452.30  0.300 
2017-10-19 06:06:00.000 1   458.00  5.700 
2017-10-19 06:03:00.000 9   459.00  NULL 
2017-10-19 06:04:00.000 9   461.20  2.200 
2017-10-19 06:05:00.000 9   462.00  0.800 
2017-10-19 06:06:00.000 9   463.00  1.000 
+0

努力をいただきありがとうございます、私はこれを試してみて、私は 'OUTER APPLY'に新しいです。私はそれについてもっと読むしようとします!しかし、上記のコメントでTom Hが言いましたように、彼は正しいと思いました。私は、クエリを失敗させた重複レコードがありました。 –

1

あなたがサポートLAG上にあるSQL Serverのバージョンは、

select t.*,t.claims-lag(t.claims) over(partition by terminal_id order by time) as claims_change 
from claimstable t 

LAGがオンに基づいて、前の行から指定された列の値を取得します使用している場合指定された順序付けと分割。最初の行(パーティション内)のLAGNULLになります。オプションの引数を使用して、デフォルト値を指定することができます。

+0

私はLAGを知らない。私はSql Server 2016を使用しています。私はそれを読んでいます。 –

関連する問題