복붙노트

[SQL] SQL Server 2008의 리드 지연 기능의 대체

SQL

SQL Server 2008의 리드 지연 기능의 대체

나는 다음 행의 값이 현재 행을 비교합니다. SQL은 다음과 이전 값을 얻을 수 LEAD 및 LAG 기능을 가지고하지만 난 SQL 서버 2008을 사용하고 있기 때문에 사용할 수 없습니다.

그래서 이걸 어떻게받을 수 있나요?

나는 출력 테이블이

+----+-------+-----------+-------------------------+
| Id | ActId |  StatusId |       MinStartTime      |
+----+-------+-----------+-------------------------+
| 1  |  42   | 1         | 2014-02-14 11:17:21.203 |
| 2  |  42   | 1         | 2014-02-14 11:50:19.367 |
| 3  |  42   | 1         | 2014-02-14 11:50:19.380 |
| 4  |  42   | 6         | 2014-02-17 05:25:57.280 |
| 5  |  42   | 6         | 2014-02-19 06:09:33.150 |
| 6  |  42   | 1         | 2014-02-19 06:11:24.393 |
| 7  |  42   | 6         | 2014-02-19 06:11:24.410 |
| 8  |  42   | 8         | 2014-02-19 06:44:47.070 |
+----+-------+-----------+-------------------------+

현재 행의 상태가 1이고 다음 행 상태가 6이고 두 시간 (분까지) 같은 경우 내가 뭘 원하는 나는이 상태가 1 행을 취득 할 수 있습니다.

예 : 아이디 6 행은 상태 1을 가지고 있으며, 아이디 (7) 행 상태 (6)을 가지고 있지만 두 번 같은 예이다. 2014년 2월 19일 6시 11분

그래서 난 상태 1, 즉이 행 또는 ID를 얻으려면. ID (6)

해결법

  1. ==============================

    1.귀하의 경우, ID를 숫자로 표시, 당신은 단지 할 수있는 자기 조인 :

    귀하의 경우, ID를 숫자로 표시, 당신은 단지 할 수있는 자기 조인 :

    select t.*
    from table t join
         table tnext
         on t.id = tnext.id - 1 and
            t.StatusId = 1 and
            tnext.StatusId = 6 and
            datediff(second, t.MinStartTime, tnext.MinStartTime) < 60;
    

    이 꽤 같은 분이 없습니다. 그것은 60 초 이내. 당신은 실제로 같은 일정 시간 분 필요하십니까? 그렇다면, 당신은 할 수 있습니다 :

    select t.*
    from table t join
         table tnext
         on t.id = tnext.id - 1 and
            t.StatusId = 1 and
            tnext.StatusId = 6 and
            datediff(second, t.MinStartTime, tnext.MinStartTime) < 60 and
            datepart(minute, t.MinStartTime) = datepart(minute, tnext.MinStartTime);
    
  2. ==============================

    2.그냥 더 복잡한 고든의 기초로 만든 두 개의 서로 다른 테이블을 사용하여 조인 게시. 특정 개체 이름 실례합니다,하지만 당신은 요점을 얻을 것이다. 하나에서 다음에 샘플의 비율 변화를 가져옵니다.

    그냥 더 복잡한 고든의 기초로 만든 두 개의 서로 다른 테이블을 사용하여 조인 게시. 특정 개체 이름 실례합니다,하지만 당신은 요점을 얻을 것이다. 하나에서 다음에 샘플의 비율 변화를 가져옵니다.

    SELECT 
          fm0.SAMPLE curFMSample
        , fm1.SAMPLE nextFMSample
        , fm0.TEMPERATURE curFMTemp
        , fm1.TEMPERATURE nextFMTemp
        , ABS(CAST((fm0.Temperature - fm1.Temperature) AS DECIMAL(4, 0)) / CAST(fm0.TEMPERATURE AS DECIMAL(4, 0))) AS fmTempChange
        , fm0.GAUGE curFMGauge
        , fm1.GAUGE nextFMGauge
        , ABS(CAST((fm0.GAUGE - fm1.GAUGE) AS DECIMAL(4, 4)) / CAST(fm0.GAUGE AS DECIMAL(4, 4))) AS fmGaugeChange
        , fm0.WIDTH curFMWidth
        , fm1.WIDTH nextFMWidth
        , ABS(CAST((fm0.Width - fm1.Width) AS DECIMAL(4, 2)) / CAST(fm0.Width AS DECIMAL(4, 2))) AS fmWidthChange
        , cl0.TEMPERATURE curClrTemp
        , cl1.TEMPERATURE nextClrTemp
        , ABS(CAST((cl0.Temperature - cl1.Temperature) AS DECIMAL(4, 0)) / CAST(cl0.TEMPERATURE AS DECIMAL(4, 0))) AS clrTempChange
    FROM 
        dbo.COIL_FINISHING_MILL_EXIT_STR02 fm0
        INNER JOIN dbo.COIL_FINISHING_MILL_EXIT_STR02 fm1 ON (fm0.SAMPLE = fm1.SAMPLE - 1 AND fm1.coil = fm0.coil)
        INNER JOIN dbo.COIL_COILER_STR02 cl0 ON fm0.coil = cl0.coil AND fm0.SAMPLE = cl0.SAMPLE
        INNER JOIN dbo.COIL_COILER_STR02 cl1 ON (cl0.SAMPLE = cl1.SAMPLE - 1 AND cl1.coil = cl0.coil)
    WHERE
        fm0.coil = 2015515872
  3. ==============================

    3.당신이 순차적 행 ID하지만 다른 단계가없는 경우 글쎄, 난 아주 간단한 솔루션을 제안 (일부 기록은 예를 들어 삭제 된 경우를 ..) :

    당신이 순차적 행 ID하지만 다른 단계가없는 경우 글쎄, 난 아주 간단한 솔루션을 제안 (일부 기록은 예를 들어 삭제 된 경우를 ..) :

    declare @t table(id int, obj_name varchar(5))
    
    insert @t select 1,'a'
    
    insert @t select 5,'b'
    
    insert @t select 22,'c'
    
    insert @t select 543,'d'
    
    ---------------------------------
    select *from @t
    

    예 소스 테이블 @t :

    ---------------------------------
    id  obj_name
    
    1   a
    
    5   b
    
    22  c
    
    543 d
    
    ---------------------------------
    

    자기가 가입과 선택

    select obj_name_prev=tt.obj_name, obj_name_next=min(t.obj_name)
    
    from @t t
    
    join @t tt on tt.id < t.id
    
    group by tt.obj_name
    

    결과:

    ---------------------------------
    obj_name_prev   obj_name_next
    
    a   b
    
    b   c
    
    c   d
    
    ---------------------------------
    
  4. from https://stackoverflow.com/questions/22188514/alternate-of-lead-lag-function-in-sql-server-2008 by cc-by-sa and MIT license