는이 작업을 수행 할 수있는 여러 가지 방법이 있습니다. 질문에서 언급 한 the link에서 언급했듯이 ROW_NUMBER() 필드의 ORDER BY 절에 사용할 수있는 시퀀스가 증가하는 다른 열이 필요할 것 같지만 파티션이있는 CTE가 작동 할 수도 있습니다.
또 다른 방법은 cursor을 사용하여 테이블의 값을 처리하고 그 결과를 임시 테이블에 저장하는 것입니다. 값이 유효한 날짜인지 확인하려면 isdate()을 사용하십시오. 아래의 예를 참조하십시오
는
declare @currentRow int =0;
declare @valueCol int = 1;
declare @column_mail varchar(100)
declare @results table(date1 datetime,val1 varchar(100),val2 varchar(100),val3 varchar(100), rowNum int)
declare DbCursor cursor for
select column_mail from mail
OPEN DBCursor
FETCH NEXT FROM DBCursor INTO @column_mail
WHILE @@FETCH_STATUS = 0
BEGIN
if (isdate(@column_mail) =1)
BEGIN
set @valueCol = 1;--reset
set @currentRow = @currentRow + 1;
insert into @results VALUES (@column_mail,null,null,null,@currentRow)
END
ELSE
BEGIN
if (@valueCol = 1)
update @results set val1 = @column_mail where rowNum = @currentRow
if (@valueCol = 2)
update @results set val2 = @column_mail where rowNum = @currentRow
if (@valueCol = 3)
update @results set val3 = @column_mail where rowNum = @currentRow
set @valueCol = @valueCol +1;
END
FETCH NEXT FROM DBCursor
INTO @column_mail
END
CLOSE DBCursor
DEALLOCATE DBCURSOR
SELECT * FROM @results
출력 :
안녕하세요 샘,이 코드는 잘 작동이 도움을 주셔서 감사합니다 .. 그것은 나에게 많은 도움이되었습니다. 나는 거대한 데이터를 가지고 똑같이 노력하고있다. –
안녕하세요 샘, 코드에 문제가 있습니다 .1) 데이터가 25086743 개의 레코드에 도달했으며 쿼리에서 처리 할 수 없습니다. 2) 다음으로 각 날짜 행 이후에 30-60 개의 전자 메일 ID 행이 있습니다. coulnt도 동적으로 처리합니다. 나는 여러 테이블로 데이터를 분할하는 것을 생각했지만, 우리는 여러 개의 복제본을 가지고 있기 때문에 바보가 아닙니다. 어떤 제안이 있습니까? –
글쎄요.이 시점에서 필자는 PHP와 같은 스크립팅 언어를 사용하고 데이터로 작업하는 것이 좋습니다. 아마도 이미 데이터베이스에 연결되어있는 스크립트 언어를 사용하고있을 것입니다. –