Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server-使用基于时间戳的重复和唯一行更新列_Sql Server_Tsql_Sql Server 2005_Ssis - Fatal编程技术网

Sql server SQL Server-使用基于时间戳的重复和唯一行更新列

Sql server SQL Server-使用基于时间戳的重复和唯一行更新列,sql-server,tsql,sql-server-2005,ssis,Sql Server,Tsql,Sql Server 2005,Ssis,我正在使用SQLServer2005,希望从我拥有的表中导出一些数据。但是,在此之前,我需要根据名为“VisitNumber”的字段更新状态列,该字段可以包含多个相同值的条目。我有一张桌子是按以下方式摆的。这里有更多的专栏,但我只是把与我的问题相关的内容放进去 ID Name MyReport VisitNumber日期时间戳状态 -- --------- -------- ----------- ----------------------- ------ 1试验约翰试验123 20

我正在使用SQLServer2005,希望从我拥有的表中导出一些数据。但是,在此之前,我需要根据名为“VisitNumber”的字段更新状态列,该字段可以包含多个相同值的条目。我有一张桌子是按以下方式摆的。这里有更多的专栏,但我只是把与我的问题相关的内容放进去

ID Name MyReport VisitNumber日期时间戳状态
--  ---------  --------  -----------  -----------------------  ------
1试验约翰试验123 2014-01-01 05.00.00.000
2测试约翰测试456 123 2014-01-01 07.00.00.000
3测试Sue Test123 555 2014-01-02 08.00.00.000
4试验Ann试验123 888 2014-01-02 09.00.00.000
5试验Ann试验456888 2014-01-02 10.00.00.000
6试验Ann试验789 888 2014-01-02 11.00.00.000
字段注释

  • ID列是增量数字中唯一的ID
  • MyReport是一个文本值,实际上可以是数千个字符。为简单而缩短。在我的场景中,文本将完全不同
  • 其余字段为varchar
我的目标

我需要解决两个条件的状态为“F”的问题:
*如果只有一个访问编号,请更新“F”的状态列
*如果有多个就诊号码,则仅根据最早的时间戳为该号码输入“F”。对于其他的,将状态设置为“a”

回到我的桌子上,这是我的期望

ID Name MyReport VisitNumber日期时间戳状态
--  ---------  --------  -----------  -----------------------  ------
1试验约翰试验123 2014-01-01 05.00.00.000 F
2试验约翰试验456 123 2014-01-01 07.00.00.000 A
3测试Sue Test123 555 2014-01-02 08.00.00.000 F
4试验Ann试验123 888 2014-01-02 09.00.00.000 F
5试验Ann试验456888 2014-01-02 10.00.00.000 A
6试验Ann试验789 888 2014-01-02 11.00.00.000 A
我想我可以通过拆分每种类型的副本/三副本+(2,3,4,5)来处理这个问题。然后每隔一行(或每3、4、5行)更新一次。然后从原始表中删除这些数据,并将它们组合在一起以导出SSIS中的数据。但我认为有一种更有效的处理方法


有什么想法吗?我可以通过在SQL中直接更新此状态列的表,然后通过SSIS正常导出来实现这一点。或者,如果有某种方法可以根据所需的确切条件操作列,那么我可以在SSIS中完成所有操作。我只是不知道如何继续进行。我编写了一个测试脚本来检查结果。出于您的目的,请使用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

希望这能有所帮助

谢谢@Kapol,这非常有效。我还学习了更多关于常用表表达式的知识。再次感谢!
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)