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



我有以下表格结构:

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

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

我能够让以下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'

如果要更新 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;

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

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

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

相关内容

  • 没有找到相关文章

最新更新