【问题标题】:SQL: Query to set value based on group parameterSQL:根据组参数查询设置值
【发布时间】:2015-03-12 21:25:49
【问题描述】:

我需要帮助编写查询以在我的数据库中的表上执行以下操作:

Select all rows where the values in Column1 are the same
    If a 'Primary' has not been set in Column2 for any of them
        Set Column2 = 'Primary' for first row in the group 
    Else go on to the next group 

关键点:每组只能有一个“主要”标签

示例输入:

Column1 | Column2 | 
ID1                 
ID1                       
ID1                     
ID2       Primary
ID2       
ID3       
ID3       

样本结果:

Column1 | Column2 | 
ID1       Primary         
ID1                       
ID1                     
ID2       Primary
ID2       
ID3       Primary   
ID3       

谢谢!

【问题讨论】:

  • 如何找到每组的第一行
  • 您能否帮我查询一下何时有超过 1 个“Primary”用于组集?这样我就可以在某个地方出现其他错误时验证我的所有数据。
  • 你能问这个问题吗

标签: sql sql-server tsql powershell active-directory


【解决方案1】:
SELECT Column1  
     ,CASE 
        WHEN ROW_NUMBER() OVER (PARTITION BY Column1 ORDER BY [TargetColumn]) = 1 
          THEN  'Primary' 
          ELSE '' 
     END AS Column2
FROM TableName

TargetColumn 将是在每组 Column1 中决定哪个值是主要值的列。

【讨论】:

    【解决方案2】:

    使用ROW_NUMER窗口函数查找每个组的第一条记录,然后只更新column2中没有primary值的记录

    由于没有可用于查找每个组的第一条记录的列,我在order by 中使用了(select null)

    样本数据

    CREATE TABLE #ee(Column1 VARCHAR(50),Column2 VARCHAR(50))
    
    INSERT #ee
    VALUES ('ID1',NULL),
           ('ID1',NULL),
           ('ID1',NULL),
           ('ID2','Primary'),
           ('ID2',NULL),
           ('ID3',NULL),
           ('ID3',NULL) 
    

    更新查询:

    ;WITH cte
         AS (SELECT *,
                    Row_number()OVER(partition BY column1 ORDER BY (SELECT NULL)) RN
             FROM   #ee a
             WHERE  NOT EXISTS (SELECT 1
                                FROM   #ee b
                                WHERE  a.Column1 = b.Column1
                                       AND b.Column2 = 'primary'))
    UPDATE cte
    SET    Column2 = 'primary'
    WHERE  rn = 1 
    

    结果:

    Column1 Column2
    ------- -------
    ID1     primary
    ID1     NULL
    ID1     NULL
    ID2     Primary
    ID2     NULL
    ID3     primary
    ID3     NULL
    

    【讨论】:

      猜你喜欢
      • 2019-06-01
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2019-02-18
      • 2020-08-28
      相关资源
      最近更新 更多