SQL Server:识别第一行值出现在列中并插入表

时间:2017-08-07 21:30:34

标签: sql sql-server row-number

我有以下表结构:

Id     | TransNbr | Type |
-------+----------+------+
1235   | 220      | A    |
1236   | 221      | A    |
1237   | 220      | A    |
1238   | 220      | B    |
1239   | 221      | B    |

我需要在此表中添加一个新列,以指示这是否是TransNbr类型的第一个A

我能够使以下SELECT查询生效...但我不确定如何将新的填充FirstTime列添加到INVOICE表:

SELECT 
    *, 
    CASE 
       WHEN (ROW_NUMBER() OVER(PARTITION BY TransNbr ORDER BY Id)) = 1 
          THEN 1 
          ELSE 0 
    END FirstTime
FROM INVOICE
WHERE Type = 'A'

2 个答案:

答案 0 :(得分:2)

如果要更新ID为1235的行上的字段,则执行以下操作:

with toupdate as (
      select i.*, row_number() over (partition by type order by id) as seqnum
      from invoice
      where type = 'A'
     )
update toupdate
    set FirstTime = 1;

如果您没有做您真正想要的事情,您可以调整CTE中的逻辑。

如果您没有FirstTime标记,则可以执行以下操作:

alter table invoice add FirstTime tinyint default 0;

答案 1 :(得分:0)

首先,您需要创建firsttime字段:

ALTER TABLE INVOICE
ADD firsttime BIT NULL;--or tinyint

这应该相应地更新新建的列。

UPDATE invoice
SETfirsttime = a.firsttime
FROM invoice 
INNER JOIN  
(
SELECT  id, 
    CASE WHEN (ROW_NUMBER() OVER(PARTITION BY TransNbr ORDER BY 
    Id))=1 THEN 1 ELSE 0 END FirstTime
FROM INVOICE 
WHERE Type = 'A')a 
ON invoice.id = a.id

使用您的示例数据进行测试,看起来不错。