T-SQL:将每个组的第一行中的字段更新为一个值,并将其余值设置为另一个值?

时间:2013-09-17 18:08:16

标签: tsql sql-server-2008-r2 group-by updates

我有这张桌子:

ID   |Type|Date
17494|NULL|2013-09-04 15:00:00.000  
17577|NULL|2013-09-04 15:00:00.000  
17639|NULL|2013-09-04 17:00:00.000  
17701|NULL|2013-09-04 17:00:00.000

我想按日期分组然后更新每个日期组第一行的类型字段并将其设置为'F',其余的(可以是一个可以是多个)将它们设置为'V'

结果:

ID   |Type|Date
17494|F   |2013-09-04 15:00:00.000  
17577|V   |2013-09-04 15:00:00.000  
17639|F   |2013-09-04 17:00:00.000  
17701|V   |2013-09-04 17:00:00.000

3 个答案:

答案 0 :(得分:1)

SQL2005 +的解决方案:

DECLARE @MyTable TABLE
(
    ID      INT NOT NULL,
    [Type]  CHAR(1) NULL,
    [Date]  DATETIME NOT NULL 
);
INSERT  @MyTable (ID, [Type], [Date])
SELECT 17494, NULL, '2013-09-04 15:00:00.000' UNION ALL
SELECT 17577, NULL, '2013-09-04 15:00:00.000' UNION ALL
SELECT 17639, NULL, '2013-09-04 17:00:00.000' UNION ALL
SELECT 17701, NULL, '2013-09-04 17:00:00.000';

WITH MyTableWithRowNum
AS
(
    SELECT  *, ROW_NUMBER() OVER(PARTITION BY x.[Date] ORDER BY x.ID) AS RowNum
    FROM    @MyTable x
)
UPDATE  MyTableWithRowNum
SET     [Type] = CASE WHEN RowNum = 1 THEN 'F' ELSE 'V' END;

SELECT * FROM @MyTable;

结果:

ID          Type Date
----------- ---- -----------------------
17494       F    2013-09-04 15:00:00.000
17577       V    2013-09-04 15:00:00.000
17639       F    2013-09-04 17:00:00.000
17701       V    2013-09-04 17:00:00.000

答案 1 :(得分:0)

试试这个:

UPDATE T
SET Type = CASE WHEN IDD = 1 THEN 'F' ELSE 'V' END
FROM (SELECT ROW_NUMBER() OVER (PARTITION BY Date ORDER BY ID) IDD , * FROM tbl) T;

<强> SQL FIDDLE DEMO

答案 2 :(得分:0)

您好没有直接查询来实现这一目标。但是我们可以通过解决这个问题来实现这一目标

With #temptable as(
select Row_number() over( PARTITION BY date1 ORDER BY date1) Rank, *
from tablea)

update TableA set Type = 'F'
where id in (select Id from #temptable where Rank = 1)

update TableA set Type = 'V'
where Type is null

select * from TableA

我在SQLFiddle中检查了它的工作http://sqlfiddle.com/#!3/bfb05/6/0

相关问题