SQL:查询根据组参数设置值

时间:2015-03-12 21:25:49

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

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

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       

谢谢!

2 个答案:

答案 0 :(得分: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的每个组中决定哪个值是主要值的列。

答案 1 :(得分:0)

使用ROW_NUMER窗口函数查找每个组的第一条记录,然后仅更新primary

中没有column2值的记录

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

示例数据

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