Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据另一列的不同值更新一行_Sql_Sql Server - Fatal编程技术网

Sql 根据另一列的不同值更新一行

Sql 根据另一列的不同值更新一行,sql,sql-server,Sql,Sql Server,我有一个包含邮政编码、郊区及其经纬度的数据集 对于每个邮政编码,在该邮政编码中有多行对应的郊区,所以当我将其与另一个在Power BI中包含按邮政编码销售的表进行匹配时,我最终会为每个邮政编码返回多行 我想做的是插入一个名为unique_postcode的列作为布尔值,将每个邮政编码的一行标记为True。我不介意哪一个。我尝试了下面的以及其他一些选项,它没有给出任何错误,但没有任何影响 UPDATE postcodes SET post_codes.unique_postcode = 1 FRO

我有一个包含邮政编码、郊区及其经纬度的数据集

对于每个邮政编码,在该邮政编码中有多行对应的郊区,所以当我将其与另一个在Power BI中包含按邮政编码销售的表进行匹配时,我最终会为每个邮政编码返回多行

我想做的是插入一个名为unique_postcode的列作为布尔值,将每个邮政编码的一行标记为True。我不介意哪一个。我尝试了下面的以及其他一些选项,它没有给出任何错误,但没有任何影响

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
未定义。