【问题标题】:SQL Server - Update Column with Handing Duplicate and Unique Rows Based Upon TimestampSQL Server - 使用基于时间戳处理重复和唯一行的更新列
【发布时间】:2014-04-11 18:39:11
【问题描述】:

我正在使用 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 中完成所有操作。我只是不确定如何继续。

【问题讨论】:

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


    【解决方案1】:
    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)
    

    【讨论】:

    • 感谢@Kapol,这非常有效。我还了解了更多关于 Common Table Expressions 的知识。再次感谢!
    【解决方案2】:

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

                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
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2011-06-03
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多