【问题标题】:Update one row based off distinct values of another column根据另一列的不同值更新一行
【发布时间】:2020-08-17 21:37:32
【问题描述】:

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

对于每个邮政编码,该邮政编码中对应郊区的多行,因此当我将其与 Power BI 中按邮政编码销售的另一个表匹配时,我最终会为每个邮政编码返回多行。

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

UPDATE postcodes
SET post_codes.unique_postcode = 1
FROM (
    SELECT DISTINCT(postcode)
    FROM postcodes
);

【问题讨论】:

  • 您可以使用row_number,如答案中所示,或者如果您的表有 id 则使用not exists(例如,更新所有不存在的行,其中不存在具有较低 ID 的行的邮政编码)。

标签: sql sql-server


【解决方案1】:

您可以使用针对随机行的可更新 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;

请注意,由于ROW_NUMBER 中使用的排序使用邮政编码本身,因此“第一”行编号值可以是任何行,以防邮政编码有多个与之关联的记录。

【讨论】:

    【解决方案2】:

    如果行无关紧要,那么最简单的方法是选择 TOP 1。

    with cte as (select top 1 * from postcodes)
    update cte
    set unique_postcode = 1;
    

    【讨论】:

      【解决方案3】:

      您可以使用row_number() 定义要分配标志的特定标志。在更新中,这看起来像:

      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”。在桌子上跑多次也是安全的。

      【讨论】:

      • 谢谢戈登。我不确定出了什么问题,没有错误消息,但也没有任何影响。
      • @PaulClarke 。 . .你应该得到一个错误,seqnum 未定义。
      猜你喜欢
      • 2018-12-11
      • 1970-01-01
      • 2023-02-22
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多