下面是填充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 & CODE2定义的所有连接。如果CODE 2具有相同的值(行为100:1,2),则CODE 3具有相同的值(A),如果CODE 1具有相同的值(1行:1,6),则CODE 3具有相同的值(A)。
知道如何做到这一点吗?
非常感谢!
发布于 2015-08-05 09:44:13
我就是这么理解的:
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的其他行是否有一个重复数大于一个的CODE2。
提供请求结果的SqlFiddle
更新
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有几个记录的情况下,我们将Zero分配给rn字段,这意味着对于所有关联的记录,A将增加零。CODE2是唯一的地方,我们运行CODE1计数并相应地增加CODE3。更新示例的Sql
我保留了SQL的原始版本,因为它本质上是相同算法的更简单的版本。
https://stackoverflow.com/questions/31828224
复制相似问题