2014-04-11 2 views
0

SQL Server 2005를 사용하면서 가지고있는 테이블의 일부 데이터를 내보내려고합니다. 그러나이를 수행하기 전에 동일한 값 항목이 여러 항목을 포함 할 수있는 "VisitNumber"라는 필드를 기반으로 상태 열을 업데이트해야합니다. 다음과 같은 방식으로 테이블을 설정했습니다. 거기에 더 많은 열이 있지만, 난 그냥SQL Server - 타임 스탬프에 따라 중복 행과 고유 한 행을 사용하여 열 업데이트

ID Name  MyReport VisitNumber DateTimeStamp   Status 
-- --------- -------- ----------- ----------------------- ------ 
1 Test John Test123 123   2014-01-01 05.00.00.000 
2 Test John Test456 123   2014-01-01 07.00.00.000 
3 Test Sue Test123 555   2014-01-02 08.00.00.000 
4 Test Ann Test123 888   2014-01-02 09.00.00.000 
5 Test Ann Test456 888   2014-01-02 10.00.00.000 
6 Test Ann Test789 888   2014-01-02 11.00.00.000 

필드 노트

  • ID 열이
  • MyReport를가있다 증가 숫자의 고유 한 ID입니다 내 문제와 관련된 무엇에 걸었습니다 텍스트 값이며 실제로 수천 개의 문자가 될 수 있습니다. 단순화를 위해 단축되었습니다.
    : 내 시나리오에서는 텍스트가

    내가 두 가지 조건은 "F"상태에두고 해결해야 필드의

  • 나머지는 VARCHAR

내 목표는 완전히 다른 것 * 방문 번호가 하나만있는 경우 "F"상태 열을 업데이트하십시오
* 방문 번호가 둘 이상인 경우 가장 빠른 시간 소인을 기준으로 "F"만 입력하십시오. 다른 사람은 "A"의 상태에 넣어

그래서 다시 내 테이블로 가고, 여기에 기대가

ID Name  MyReport VisitNumber DateTimeStamp   Status 
-- --------- -------- ----------- ----------------------- ------ 
1 Test John Test123 123   2014-01-01 05.00.00.000 F 
2 Test John Test456 123   2014-01-01 07.00.00.000 A 
3 Test Sue Test123 555   2014-01-02 08.00.00.000 F 
4 Test Ann Test123 888   2014-01-02 09.00.00.000 F 
5 Test Ann Test456 888   2014-01-02 10.00.00.000 A 
6 Test Ann Test789 888   2014-01-02 11.00.00.000 A 

내가 중복의 각 종류를 분할하여이 문제를 해결할 수있는 생각/triplicates + (2,3,4,5). 그런 다음 다른 모든 (또는 모든 3,4,5 행)을 업데이트합니다. 그런 다음 원본 테이블에서 해당 테이블을 삭제하고 함께 결합하여 SSIS의 데이터를 내 보냅니다. 그러나 나는 그것을 처리하는 훨씬 더 효율적인 방법이 있다고 생각하고있다.

의견이 있으십니까? 이 상태 열의 SQL에서 테이블을 직접 업데이트 한 다음 SSIS를 통해 정상적으로 내보냄으로써이 작업을 수행 할 수 있습니다. 또는 필요한 조건에 맞게 열을 조작 할 수있는 방법이있는 경우 SSIS에서이 모든 작업을 수행 할 수 있습니다. 나는 이걸 어떻게 진행해야할지 모르겠다.

답변

0
WITH cte AS 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY VisitNumber ORDER BY DateTimeStamp) rn from MyTable 
) 

UPDATE cte 
SET [status] = (CASE WHEN rn = 1 THEN 'F' ELSE 'A' END) 
+0

감사 @Kapol을하는 데 도움이됩니다. 나는 또한 Common Table Expressions에 대해 더 많이 배웠다. 다시 한 번 감사드립니다! – user1937434

0

테스트 스크립트를 조합하여 결과를 확인합니다. 사용자의 목적을 위해 update 문을 사용하고 temp 테이블을 테이블 이름으로 바꿉니다.

  create table #temp1 (id int, [name] varchar(50), myreport varchar(50), visitnumber varchar(50), dts datetime, [status] varchar(1)) 

    insert into #temp1 (id,[name],myreport,visitnumber, dts) values (1,'Test John','Test123','123','2014-01-01 05:00') 
    insert into #temp1 (id,[name],myreport,visitnumber, dts) values (2,'Test John','Test456','123','2014-01-01 07:00') 
    insert into #temp1 (id,[name],myreport,visitnumber, dts) values (3,'Test Sue','Test123','555','2014-01-01 08:00') 
    insert into #temp1 (id,[name],myreport,visitnumber, dts) values (4,'Test Ann','Test123','888','2014-01-01 09:00') 
    insert into #temp1 (id,[name],myreport,visitnumber, dts) values (5,'Test Ann','Test456','888','2014-01-01 10:00') 
    insert into #temp1 (id,[name],myreport,visitnumber, dts) values (6,'Test Ann','Test789','888','2014-01-01 11:00') 

    select * from #temp1; 

    update #temp1 set status = 'F' 
    where id in (
    select id from #temp1 t1 
    join (select min(dts) as mindts, visitnumber 
      from #temp1 
      group by visitNumber) t2 
    on t1.visitnumber = t2.visitnumber 
    and t1.dts = t2.mindts) 

    update #temp1 set status = 'A' 

    where id not in (
    select id from #temp1 t1 
    join (select min(dts) as mindts, visitnumber 
      from #temp1 
      group by visitNumber) t2 
    on t1.visitnumber = t2.visitnumber 
    and t1.dts = t2.mindts) 

    select * from #temp1; 
    drop table #temp1 

희망이이 완벽하게 작동,

관련 문제