안녕하세요
제목을 어떻게 적어야 할지 몰라 임의로 적었습니다.
테이블에 데이터는 아래와 같이 있습니다.
idx | datetime | result
1 날짜시간 0
2 날짜시간 1
3 날짜시간 1
4 날짜시간 1
5 날짜시간 0
6 날짜시간 1
7 날짜시간 0
이런식으로 데이터가 3분에 한개씩 5만개 이상 있습니다.
필드는 idx 주키, datetime 날짜시간,
result 는 0 혹은 1 의 랜덤값 입니다.
제가 쿼리 하고 싶은 내용은
예를 들어 result 의 0, 1 의 패턴을 찾는다면 위 데이터로는
주키 1, 2번과 동일 하고 주키 5, 6번과 동일 하니
결과값 보여 줄때 주키 1, 2, 3과 5, 6, 7을 보여 줘야 합니다.
패턴 1, 1, 1 을 찾는다면 주키 기준으로 2, 3, 4와 같으니
결과로는 2, 3, 4, 5 를 보여 주면 됩니다.
요점은 특정 패턴과 같은걸 찾아서
다음번에 뭐가 나왔는지를 확인 할려는 것입니다.
도무지 어떻게 짜야 할지 몰라 질문드립니다
쿼리만으로 안된다면 다른 좋은 방법좀 알려주세요
Comment 2
-
Terry
2016.02.22 11:33
-
Terry
2016.02.22 14:32
동적 sql 로 pattern 길이 상관없이 처리하는 SQL 입니다.
---쿼리시작---
Declare @as_pattern varchar(10) = '01'
Declare @ll_cnt Decimal(18,0)
Declare @sql varchar(max)
Declare @i decimal(18,0)Set @ll_cnt = LEN(@as_pattern)
--Select @as_pattern
--Drop Table #t1
Create Table #t1
(
idx decimal(18,0) null
,datetime varchar(23 ) null
,result char(1) null
)--Drop Table #t2
Create Table #t2
(
idx decimal(18,0) null
,datetime varchar(23 ) null
,result char(1) null
-- ,grp decimal(18,0) null
)Insert
Into #t1
Select 1,'2015-01-01 00:00:00.000','0' Union All
Select 2,'2015-01-01 00:00:00.000','1' Union All
Select 3,'2015-01-01 00:00:00.000','1' Union All
Select 4,'2015-01-01 00:00:00.000','1' Union All
Select 5,'2015-01-01 00:00:00.000','0' Union All
Select 6,'2015-01-01 00:00:00.000','1' Union All
Select 7,'2015-01-01 00:00:00.000','0'Set @sql = ' Select a.idx
,a.datetime
,a.result
From #t1 a
'
Set @i = 1
While @i < @ll_cnt
Begin
Set @i = @i + 1
Begin
Set @sql = @sql + ' Inner Join #t1 ' + CHAR(97 + @i) + ' On a.idx = ' + CHAR(97 + @i) + '.idx -' + Convert(varchar(max),@i - 1) + ' And ' + CHAR(97 + @i) + '.result = ''' + SUBSTRING(@as_pattern,@i,1) + ''''
End
End
Set @sql = @sql + ' Where a.result = ''' + SUBSTRING(@as_pattern,1,1) + ''''--Select @sql --동적 쿼리로 생성된 전체 쿼리 조회하려면 주석 제거 필요
Insert
Into #t2
Exec ( @sql )Select b.*
From #t2 a
Inner Join #t1 b
On b.idx Between a.idx And a.idx + @ll_cnt
---쿼리끝---
쿼리로 충분히 가능합니다.
그나마 패턴이 2개인 경우가 제일 심플해보여서
해당건 토대로 쿼리 작성해봤네요.
2개 이상인 경우는..문자열을 결합후 분석하는 형태로 하시면 될듯하네요.
하기쿼리 참고하세요.
---쿼리시작---
Declare @as_from_gubn char(1) = '0'
,@as_to_gubn char(1) = '1'
;with tblA(idx,datetime,result) As
(
Select 1,'2015-01-01 00:00:00.000','0' Union All
Select 2,'2015-01-01 00:00:00.000','1' Union All
Select 3,'2015-01-01 00:00:00.000','1' Union All
Select 4,'2015-01-01 00:00:00.000','1' Union All
Select 5,'2015-01-01 00:00:00.000','0' Union All
Select 6,'2015-01-01 00:00:00.000','1' Union All
Select 7,'2015-01-01 00:00:00.000','0'
)
,tblB(idx,datetime,result,grp) As
(
Select a.*
,a.idx
From tblA a
Where a.result = @as_from_gubn
And Exists (
Select 'x'
From tblA b
Where b.result = @as_to_gubn
And b.idx = a.idx + 1
)
Union All
Select b.*
,a.idx
From tblB a
Inner Join tblA b
On a.idx = b.idx -1
And a.result = @as_from_gubn
Where b.result = @as_to_gubn
)
,tblC(idx,datetime,result,grp) As
(
Select a.*
From tblB a
Union All
Select c.idx
,c.datetime
,c.result
,a.grp
From tblB a
Inner Join
tblA c
On a.idx = c.idx - 1
Where a.idx = (
Select MAX(b.idx)
From tblB b
Where b.grp = a.grp
)
)
Select a.*
From tblC a
Order By a.idx Asc
---쿼리끝---