2013-09-06 2 views
3

내 쿼리에서 고유 패턴을 분석하고 패턴이 다른 열에 나타나는지 보여 주려고합니다.SQL - 동일한 쿼리의 여러 행을 비교하는 열을 선택하십시오.

예 : 내 쿼리에서

내가 얻을 :

---------- 
| Date | Value| Ascending | 
---------- 
| 1 | 0.8 |  0  | 
---------- 
| 2 | 0.2 |  1  | 
---------- 
| 3 | 0.4 |  1  | 
---------- 
| 4 | 0.6 |  1  | 
---------- 
| 5 | 0.3 |  0  | 

상승하는 열은 단지입니다 : 같은

---------- 
| Date | Value| 
---------- 
| 1 | 0.8 | 
---------- 
| 2 | 0.2 | 
---------- 
| 3 | 0.4 | 
---------- 
| 4 | 0.6 | 
---------- 
| 5 | 0.3 | 

것은 내가 하강/상승하는 3 포인트가 있는지 확인하고 그 결과를 얻으려면 비트와 그 패턴을 형성하는 모든 값은 참이됩니다.

아이디어가 있으십니까?

+0

이 오라클 – Randy

+1

에서 LAG 기능이 될 것입니다 왜 녹음 "4"오름차순 = 1 "로 표기 "? –

+0

이 경우 오름차순 패턴을 형성하는 시퀀스는 0.2, 0.4, 0.6입니다. 실제로 5의 오름차순 시퀀스를 찾으려고하지만 문제를 단순화하기 위해 3을 넣습니다. – user2755428

답변

8

다음 코드는 완전한 대답이 아닙니다. 두 개의 숫자를 비교합니다.

다음 값과 비교해야합니다. 두 데이터베이스에서 작업 한 후 다음,해야 "날짜"열이 정말 숫자입니다 가정하고 (당신이 문제의 제안으로) 어떤 구멍 상승 :

select t.*, 
     (case when tnext.value > t.value then 1 else 0 end) as "ascending" 
from t left outer join 
    t tnext 
    on t."date" = tnext."date" - 1; 

당신이 3 개 행을 비교할 경우, 더 설명이 필요 . 내가 생각할 수있는 정의가 귀하의 결과에 적용되지 않습니다.

편집 :

는 흠, 당신은 오름차순 시퀀스를 찾기 위해, 적어도 세 개의 행이 사람을 표시 할 것으로 보인다. 그렇다면 조금 더 어렵습니다. 다음은 다음 기술을 사용하여 시퀀스를 열거합니다. 시퀀스의 시작을 식별 한 다음 각 값까지의 시작 수를 계산합니다.

는, 오름차순 시퀀스의 시작을 식별 값이 아래로 어디로 쌍을 확인합니다 :

select t.*, 
     (select 1 
     from t tprev 
     where tprev."date" = t."date" - 1 and 
       tprev.value >= t.value 
    ) as IsAscStart 
from t; 

는 각 시퀀스에게 자신의 ID를 제공하기 위해 :

select t.* 
     (select count(*) 
     from t t1 join 
      t tprev 
      on tprev."date" = t1."date" - 1 and 
       tprev.value > t1.value 
     where t1."date" <= t."date" 
     ) as AscGrouping 
from t; 

이의 도전 요점은 그 때 순서의 길이를 얻고있다. 이 접근 방법은 SQL Server와 MySQL간에 매우 다양하므로 쉽게 데이터베이스에 의존하지 않는 방법을 생각할 수는 없습니다.

편집 II :

SQL 서버에서

, 당신은 당신이 아니라 원하는 것을 할 수 있습니다

with cte as (
    select t.* 
      (select count(*) 
      from t t1 join 
       t tprev 
       on tprev."date" = t1."date" - 1 and 
        tprev.value > t1.value 
      where t1."date" <= t."date" 
      ) as AscGrouping 
    from t 
    ) 
select t."date", t.value, 
     (case when seqlen >= 3 then 1 else 0 end) as "Ascending" 
from (select cte.*, count(*) over (partition by AscGrouping) as seqlen 
     from cte 
    ) t 
+0

이것은 좋은 방법입니다. 그러나 OP의 원하는 출력에서'1 '대신에'date = 4'에'0 '을줍니다. – peterm

+0

SQL Server에서 시퀀스의 길이를 어떻게 바꿀 수 있습니까? – user2755428

+0

고든에게 도움을 주셔서 감사합니다. 한 가지 혼란 스러울 때, "t1.id <= t.id"라고 할 때 어떤 열을 언급하고 있습니까? "id"열이 없기 때문에 – user2755428

관련 문제