SQL Server - 根据时间戳更新列,并提供重复和唯一的行

时间:2014-04-11 18:39:11

标签: sql-server tsql sql-server-2005 ssis

我正在使用SQL Server 2005并希望从我拥有的表中导出一些数据。但是,在此之前,我需要根据名为" VisitNumber"的字段更新状态列,该字段可以包含多个条目相同的值条目。我有一个以下列方式设置的表格。还有更多专栏,但我只是提出了与我的问题相关的内容

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列是增量数字中的唯一ID
  • MyReport是一个文本值,实际上可以是数千个字符。缩短为简单。在我的场景中,文字将完全不同为
  • 其他字段为varchar

我的目标

我需要解决的问题是" F"两个条件:
*如果只有一个VisitNumber,请更新" 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

我想我可以通过分割每种类型的重复/重复+(2,3,4,5)来处理这个问题。然后每隔一次(或每3,4,5行)更新一次。然后从原始表中删除它们并将它们组合在一起以导出SSIS中的数据。但我认为有一种更有效的方法来处理它。

有什么想法?我可以通过直接在SQL中为此状态列更新表,然后通过SSIS正常导出来实现此目的。或者,如果有某种方法我可以根据我需要的确切条件操作列,我可以在SSIS中完成所有操作。我只是不确定如何处理这个问题。

2 个答案:

答案 0 :(得分:0)

我整理了一个测试脚本来检查结果。出于您的目的,请使用update语句并将临时表替换为表名。

            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

希望这有帮助

答案 1 :(得分: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)