2013-10-07 2 views
1

기본적으로 레코드가 들어있는 테이블이 있습니다. 그리고 지금은 값이 단조롭게 증가하고 있는지를 판단해야합니다.SQL 서버가 값이 단조로운 지 확인하십시오.

CTE 표현 (코드는 아래 참조)을 사용하여 원하는 결과를 얻었지만 해결책은 나에게 상당히 명백한 것처럼 보입니다.

필드 값 시퀀스가 ​​단조인지 여부를 판단하는 더 좋은 방법이 있습니까?

CREATE TABLE [dbo].[Measurements](
    [ObjectID] [int] IDENTITY(1,1) NOT NULL, 
    [measDate] [datetime] NULL, 
    [measValue] [float] NULL 
) ON [PRIMARY]; 

DECLARE 
    @ObjectID INT = 1; 

with measSet as (
    select row_number() over(order by measDate) rownum, measValue, measDate 
    from dbo.Measurements M 
     where M.measDate > convert(datetime, '2013-10-02 08:13:00', 120) 
      and M.ObjectID = @ObjectID 
) 
select case when count(b.DiffSign) = 1 then 1 else 0 end as IsMonotone 
    from ( 
    select DiffSign from 
    (
    select MSS.measDate , MSS.measValue, MSS.measValue- MSSD.measValue as Diff, 
    case 
     when MSS.measValue- MSSD.measValue is null then NULL 
     when MSS.measValue- MSSD.measValue= 0 then NULL 
     when MSS.measValue- MSSD.measValue< 0 
     then -1 
     else 1 
    end as DiffSign 
    from measSet MSS 
    left join measSet MSSD 
     on MSSD .rownum = MSS.rownum - 1 
    ) a 
    where a.DiffSign is not null 
    group by a.DiffSign 
) b 
+1

팁 : 당신이 할 수 있습니다를 'SIGN()'함수를 보라. 'Case Sign (MSS.measValue - MSSD.measValue)가 0 일 때 ... '. 다양한 솔루션의 실행 계획을 비교하십시오. 우아하게 보이는 것은 최적화 프로그램이 정상적으로 처리하지 않을 수 있습니다. – HABO

+0

SIGN 함수에 대해 생각 나게하기 위해 Thnaks - 괜찮아요,하지만 내 경우에는 단조 분석가에서 "0"- 차이 값을 제외하는 것이 중요합니다 - 그들은 결과를 초래해서는 안됩니다. 그렇지 않으면 SIGN func을 의심없이 사용합니다. – xacinay

답변

4

당신이 특정 레코드가 단조 로움을 깨는 무엇을 알고 걱정하지 않는 경우에, 당신은 좀 더 컴팩트 같은 것을 사용할 수 있습니다 :

SELECT CASE WHEN COUNT(*) = 0 THEN 1 ELSE 0 END AS IsMonotone 
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY measDate) AS RowNum, measValue 
    FROM Measurements 
) T1 INNER JOIN (
    SELECT ROW_NUMBER() OVER (ORDER BY measValue) AS RowNum, measValue 
    FROM Measurements 
) T2 ON T1.RowNum = T2.RowNum 
WHERE T1.measValue <> T2.measValue 
+0

아마도 가장 우아한 해결책 일 겁니다. – xacinay

관련 문제