Удалить дубликаты номеров в ячейке sql - PullRequest
0 голосов
/ 07 ноября 2019

Я новичок в SQL. Использование Teradata.

Мне нужно удалить дубликаты чисел в ячейке SQL.

Например:

In: 1, 2, 3, 4, 5, 2, 3, 6

Out: 1, 2, 3, 4, 5, 6

У меня более миллиона похожих ячеек в столбце

Ответы [ 4 ]

0 голосов
/ 11 ноября 2019

обычно не очень удобно иметь несколько значений в одной ячейке (3NF и друзья ...) - но вы можете применить это позже с помощью STRTOK или CSV -функций. К этому результату вы можете применить простое отличное.

0 голосов
/ 07 ноября 2019

Например, вы можете попробовать это.

Примечание: вы можете разделить данные, используя 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

Output

0 голосов
/ 07 ноября 2019

Это путаница нескольких методов и предполагает, что у вас включены службы XML. У меня нет системы 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
;

Идея состоит в том, чтобы разделить запятуюзначение, удалите дубликаты, а затем заново создайте строку с разделителями с новыми дедуплицированными значениями. Вот некоторые ссылки:

Разделить список с разделителями
Создать разделенный список

0 голосов
/ 07 ноября 2019

ОБНОВЛЕНО
Я не знаком с 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

После этого вы можете объединять строки с помощьюкурсор. Вы можете увидеть здесь для получения дополнительной информации.

...