2017-10-31 11 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 

나는 time, claim을 선택하고 내 테이블에서 새 열 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 행에 대해이 테스트는, 그러나, 잘 작동 내가 10 행으로이를 테스트 할 때 나는이 같은 오류가

메시지 512, 수준 16, 상태 1, 줄 42
Subqu ery가 1 이상의 값을 반환했습니다. 하위 쿼리가 =,! =, <, < =,>,> = 또는 하위 쿼리가 식으로 사용될 때 하위 쿼리가 수행되는 경우에는 허용되지 않습니다.

나는 더 오래된 posts을 읽었으며, 권장 답변은 inner join이었다.

내 경우에는 정확하게 을 사용하여 변수를 얻는 방법을 모르겠습니다.

도움이 될 것입니다.

+0

예상 출력도 표시 할 수 있습니까? –

+2

숫자에서 결과 집합을 뺍니다. 결과 집합이 둘 이상의 값을 반환하는 경우 SQL Server는 실제로 수행 할 작업을 알지 못합니다. 예를 들어 3 - (1, 4, 6)은 무엇입니까? 여러 행을 반환하려는 경우 정확한 요구 사항을 지정하여 추가 정보를 질문에 추가해야합니다. 그렇지 않다면 왜 여러 행을 얻는 지와 비즈니스 규칙에 따라 행을 하나씩 줄이는 것이 무엇인지 알아야합니다. –

+0

@ 토미, 당신 말이 맞아요, 당신의 의견 후, 나는 데이터를 조금 파고 어떻게 든 중복 기록을 발견. 나는 그것을 발견하고 그것을 고정, 멋진 의견 주셔서 감사합니다 :) –

답변

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

노력 해줘서 고마워, 나는 이것을 시도하고, 나는 '새로운 적용 아웃'입니다. 나는 그것에 대해 더 많이 읽으려고 노력할 것이다!. 그러나 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을 사용하고 있으며, 나는 그것에 대해 읽을 것이다. –