1

我正在处理一个需要检索 ID 列表和值的查询。

然后我需要为那些具有多个值的 ID 转换一个新值。

例如:

ID          COLOR
1           BLUE
1           GREEN
2           ORANGE

我想返回的是这样的:

ID          COLOR
1           MULTIPLE
2           ORANGE

到目前为止,我已经使用 ROW_NUMBER() 和 OVER(PARTITION BY) 来检索所有结果并对它们进行编号。

但后来我被困在圈子里。

我可以限制那些出现多次(行数> = 2)的ID,并且我得到那些需要转换为“MULTIPLE”的ID。

但是:如果我限制为只有一个值 (=1) 的 ID,也会包括这些相同的值,因为多个值 ID 也有一个行号 1。我最终得到一个无效的结果,因为我正在计算多个 - value-IDs 两次,有点像这样:

ID         COLOR
1          BLUE
1          MULTIPLE
2          ORANGE

所以问题是:我怎样才能获得所有具有多个值的 ID,与那些只有一个值的 ID 分开?

4

2 回答 2

4

尝试这个:

SELECT id, 
CASE WHEN COUNT(color) > 1 THEN 'MULTIPLE'
     ELSE MAX(color)
END AS color
FROM Table1
GROUP BY id

我在 SQLFIDDLE http://sqlfiddle.com/#!6/daf77/4中进行了测试,似乎工作正常

于 2013-10-16T23:27:06.977 回答
1

这是使用窗口聚合函数完成此操作的一种方法:

CREATE VOLATILE TABLE MyTable, NO FALLBACK
(MyID SMALLINT NOT NULL,
 MyColor VARCHAR(10) NOT NULL
)
PRIMARY INDEX (MyID)
ON COMMIT PRESERVE ROWS;

INSERT INTO MyTable VALUES (1, 'BLUE');
INSERT INTO MyTable VALUES (1, 'GREEN');
INSERT INTO MyTable VALUES (2, 'ORANGE');

SELECT *
  FROM MyTable;

SELECT MyID
     , CASE WHEN MyCount = 1
            THEN MyColor
            ELSE 'MULTIPLE'
       END AS MyNewColor
  FROM (SELECT MyID
             , MyColor
             , ROW_NUMBER() OVER (PARTITION BY MyID 
                                  ORDER BY MyColor)   AS MyRowNum
             , COUNT(*) OVER (PARTITION BY MyID)      AS MyCount
          FROM MyTable
        ) DT1
  WHERE MyRowNum = 1;

结果:

MyID  MyNewColor
----  ----------
2     ORANGE
1     MULTIPLE
于 2013-10-16T23:48:09.040 回答