下面是填充了CODE1
和CODE2
的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)。
知道如何实现这个目标吗?
非常感谢!
答案 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
上面的代码中涉及到一些魔法,我将尝试解释:
CODE2
组有多条记录,我们指定A
。CODE2
有多条记录,我们会将零分配给rn
字段,这意味着所有相关记录的A
将增加零。CODE2
是唯一的,我们会运行CODE1
计数并相应地增加CODE3
。Sql Fiddle for the updated example
我保留了原始版本的SQL,因为它本质上是相同算法的简单版本。