SQL 服务器:识别出现在列中的第一行值并插入 table
SQL Server : identify first row value appears in column and insert into table
我有以下 table 结构:
Id | TransNbr | Type |
-------+----------+------+
1235 | 220 | A |
1236 | 221 | A |
1237 | 220 | A |
1238 | 220 | B |
1239 | 221 | B |
我需要向此 table 添加一个新列,以指示这是否是 A
.
类型的第一个 TransNbr
我能够使以下 SELECT
查询正常工作...但我不确定现在如何将新的填充 FirstTime
列添加到 INVOICE
table:
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
使用您的示例数据进行了测试,看起来不错。
我有以下 table 结构:
Id | TransNbr | Type |
-------+----------+------+
1235 | 220 | A |
1236 | 221 | A |
1237 | 220 | A |
1238 | 220 | B |
1239 | 221 | B |
我需要向此 table 添加一个新列,以指示这是否是 A
.
TransNbr
我能够使以下 SELECT
查询正常工作...但我不确定现在如何将新的填充 FirstTime
列添加到 INVOICE
table:
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
使用您的示例数据进行了测试,看起来不错。