[SQL] SQL Server 2008의 리드 지연 기능의 대체
SQLSQL 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.귀하의 경우, 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.그냥 더 복잡한 고든의 기초로 만든 두 개의 서로 다른 테이블을 사용하여 조인 게시. 특정 개체 이름 실례합니다,하지만 당신은 요점을 얻을 것이다. 하나에서 다음에 샘플의 비율 변화를 가져옵니다.
그냥 더 복잡한 고든의 기초로 만든 두 개의 서로 다른 테이블을 사용하여 조인 게시. 특정 개체 이름 실례합니다,하지만 당신은 요점을 얻을 것이다. 하나에서 다음에 샘플의 비율 변화를 가져옵니다.
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.당신이 순차적 행 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 ---------------------------------
from https://stackoverflow.com/questions/22188514/alternate-of-lead-lag-function-in-sql-server-2008 by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 다른 데이터베이스에서 쿼리의 결과에 따라 데이터베이스 쿼리 (0) | 2020.05.28 |
---|---|
[SQL] 콤마 구별 값 MySQL의 PHP 선택 횟수 데이터 (태그)를 구분 (0) | 2020.05.28 |
[SQL] SQL에서 HEX에 문자열 변환 (0) | 2020.05.27 |
[SQL] 어떻게 SSIS에서 동적 입력 및 출력 열을 매핑하는? (0) | 2020.05.27 |
[SQL] 크로스 중복 조합없이 가입 (0) | 2020.05.27 |