SQL - 使用正确的值自动填充列

时间:2015-08-05 09:15:04

标签: sql sql-server

下面是填充了CODE1CODE2的SQL表,CODE3我输入了我想要自动填充的值。总共超过500.000行。

CODE1   CODE2   CODE3  
 1      100       A  
 2      100       A  
 3      200       B  
 4      300       A  
 5      300       A  
 1      300       A  
 5      400       A  
 6      400       A  
 2      400       A  
 7      500       C
 8      300       A
 7      600       C
 2      800       A
 3      900       B

我必须自动填充CODE3,以便对CODE1和&amp ;;定义的所有连接进行分组。 CODE2。 如果CODE 2具有相同的值(行数为100:1,2)CODE 3将具有相同的值(A),并且CODE 1具有相同的值(行数为1:1,6) )CODE 3将具有相同的值(A)。

知道如何实现这个目标吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

这就是我理解的方式:

WITH CODE_COUNTS AS (
SELECT *, COUNT(*) OVER (PARTITION BY CODE2) as CODE2_DUPES
FROM CODES
) 
SELECT 
  CODE1, 
  CODE2,
  CASE WHEN CD.CODE2_DUPES > 1 THEN 'A'
      WHEN EXISTS (SELECT * FROM CODE_COUNTS
                   WHERE CD.CODE1 = CODE1 AND CODE2_DUPES > 1) THEN 'A'
      ELSE 'B' 
  END CODE3
FROM CODE_COUNTS CD;

此代码首先计算CTE中每个CODE2中的重复项。在此之后,对于每个CODE1,我们检查具有相同CODE1的任何其他行是否具有大于1的重复数的CODE2。

SqlFiddle that provides requested results

<强>更新

WITH CODE_COUNTS AS (
SELECT code1, code2, 
   COUNT(*) OVER (PARTITION BY CODE2) as CODE2_DUPES,
   CASE -- Assign row number within CODE1, where CODE2 is unique
     WHEN COUNT(*) OVER (PARTITION BY CODE2) > 1 THEN 0
     ELSE  ROW_NUMBER() OVER (PARTITION BY CODE1 ORDER BY CODE2) 
   END rn
FROM CODES
) 
SELECT CD.CODE1, CD.CODE2,
 CASE WHEN CD.CODE2_DUPES > 1 THEN 'A' -- CODE is not unique
 ELSE CHAR(ASCII('A') + SUM(CASE WHEN rn = 1 THEN 1 ELSE 0 END) OVER (
           ORDER BY CODE1) ) END CODE3
FROM CODE_COUNTS CD
ORDER BY CD.CODE1, CD.CODE2

上面的代码中涉及到一些魔法,我将尝试解释:

  1. 我假设CODE2组有多条记录,我们指定A
  2. 如果CODE2有多条记录,我们会将零分配给rn字段,这意味着所有相关记录的A将增加零。
  3. CODE2是唯一的,我们会运行CODE1计数并相应地增加CODE3
  4. Sql Fiddle for the updated example

    我保留了原始版本的SQL,因为它本质上是相同算法的简单版本。