Sql 根据另一列的不同值更新一行
我有一个包含邮政编码、郊区及其经纬度的数据集 对于每个邮政编码,在该邮政编码中有多行对应的郊区,所以当我将其与另一个在Power BI中包含按邮政编码销售的表进行匹配时,我最终会为每个邮政编码返回多行 我想做的是插入一个名为unique_postcode的列作为布尔值,将每个邮政编码的一行标记为True。我不介意哪一个。我尝试了下面的以及其他一些选项,它没有给出任何错误,但没有任何影响Sql 根据另一列的不同值更新一行,sql,sql-server,Sql,Sql Server,我有一个包含邮政编码、郊区及其经纬度的数据集 对于每个邮政编码,在该邮政编码中有多行对应的郊区,所以当我将其与另一个在Power BI中包含按邮政编码销售的表进行匹配时,我最终会为每个邮政编码返回多行 我想做的是插入一个名为unique_postcode的列作为布尔值,将每个邮政编码的一行标记为True。我不介意哪一个。我尝试了下面的以及其他一些选项,它没有给出任何错误,但没有任何影响 UPDATE postcodes SET post_codes.unique_postcode = 1 FRO
UPDATE postcodes
SET post_codes.unique_postcode = 1
FROM (
SELECT DISTINCT(postcode)
FROM postcodes
);
您可以使用针对随机行的可更新CTE:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY postcode ORDER BY postcode) rn
FROM postcodes
)
UPDATE cte
SET unique_postcode = 1
WHERE rn = 1;
请注意,由于
行编号中使用的排序使用邮政编码本身,“第一”行编号值可以是任何一行,前提是邮政编码有多条记录与之关联。您可以使用行编号()
来定义要将标志分配给的特定行。在更新中,这看起来像:
WITH toupdate AS (
SELECT p.*, ROW_NUMBER() OVER (PARTITION BY postcode ORDER BY postcode) as seqnum
FROM postcodes p
)
UPDATE toupdate
SET unique_postcode = (CASE WHEN seqnum = 1 THEN 1 ELSE 0 END);
注意:这将一个值设置为“1”,其余值设置为“0”。在表上运行多次也是安全的。如果行不重要,那么最简单的方法就是选择TOP 1
with cte as (select top 1 * from postcodes)
update cte
set unique_postcode = 1;
您可以使用答案中所示的行编号
,或者如果您的表有id,则可以使用不存在
(例如,在不存在的所有行中更新一个具有较低id的邮政编码行)。谢谢。我不确定出了什么问题,没有错误消息,但也没有任何影响。@PaulClarke。您应该得到一个错误,seqnum
未定义。