我是SQL的初学者。使用Teradata。
我需要删除SQL
单元格中的重复数字。
例如:
In: 1, 2, 3, 4, 5, 2, 3, 6
Out: 1, 2, 3, 4, 5, 6
我在一列中有超过一百万个类似的单元格
答案 0 :(得分:0)
已更新
我不熟悉Teradata sql,但我认为此解决方案可能有效:
SELECT DISTINCT CellValue
FROM TABLE (STRTOK_SPLIT_TO_TABLE('tmp_test', 'Your SQL Cell String', ',')
RETURNS
(
Outkey VARCHAR(10) CHARACTER SET UNICODE
,CellValue VARCHAR(10) CHARACTER SET UNICODE)
) AS dt
在此之后,您可以使用游标连接行。您可以查看here了解更多信息。
答案 1 :(得分:0)
这是多种方法的混搭,并假定您已启用XML Services。我没有可以测试的TD
系统,因此它可能或很多不起作用,但希望它将为您提供一个起点:
WITH cte (
SELECT ROW_NUMBER() OVER() AS id, MyCol AS str -- Give an "id" to each row
FROM MyTable
)
SELECT
TRIM(
TRAILING ',' FROM (
XMLAGG(src.token || ',' ORDER BY src.token) (VARCHAR(10000))
)
)
FROM (
SELECT d.outkey, d.token
FROM TABLE (
STRTOK_SPLIT_TO_TABLE(cte.id, cte.str, ', ')
RETURNS (outkey integer, tokennum integer, token varchar(10))
) as d
GROUP BY outkey, token -- Remove duplicate entries
) src
GROUP BY src.outkey -- Build new values
;
这个想法是拆分以逗号分隔的值,删除重复项,然后使用新的去重复的值重新构建分隔的字符串。这里是一些参考:
答案 2 :(得分:0)
通常在一个单元格(3NF和朋友...)中具有多个值并不是很好的样式-但是您可以随后使用STRTOK或CSV应用此功能-Functions 要获得此结果,您可以应用一个简单的区别。
答案 3 :(得分:-1)
例如,您可以尝试一下。
注意:您可以使用delimiter
SQL查询
DECLARE @String VARCHAR(MAX) = '1, 2, 3, 4, 5, 2, 3, 6';
DECLARE @Delimiter CHAR(1) = ','
DECLARE @temptable TABLE(Items VARCHAR(255))
DECLARE @idx INT
DECLARE @slice VARCHAR(MAX)
SELECT @idx = 1
IF LEN(@String)<1 OR @String IS NULL RETURN
WHILE @idx!= 0
BEGIN
SET @idx = CHARINDEX(@Delimiter,@String)
IF @idx!=0
SET @slice = LEFT(@String,@idx - 1)
ELSE
SET @slice = @String
IF(LEN(@slice)>0)
INSERT INTO @temptable(Items) VALUES(TRIM(@slice))
SET @String = RIGHT(@String,LEN(@String) - @idx)
IF LEN(@String) = 0 BREAK
END
SELECT (STUFF((SELECT DISTINCT ', ' + Items From @temptable FOR XML PATH('')),1,2,''))
OutPut