Как удалить дубликат в одной строке

У меня есть таблица со столбцом columna с данными в одной строке:

columna
-----------------
a,b,a,b,a,b,a,b

Я пробовал это, но это нехорошо

duplicated_rows AS 
(
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY columna) AS row_num
    FROM 
        tablea
)
SELECT * 
FROM duplicated_rows
WHERE row_num > 1;

Не знаю, как удалить дубликат, чтобы получить результат

columna
-------
a,b

получил ошибку. Оконные функции и функции NEXT VALUE FOR не поддерживают целочисленные индексы в качестве выражений предложения ORDER BY.

mike 10.07.2024 19:32

Да, вы имеете в виду, что у вас есть одна строка со значением столбца, разделенным запятыми? Возможно, в этом проблема: не храните несколько элементов в одном столбце.

siggemannen 10.07.2024 19:40
select distinct val from tablea cross apply (select string_split(a)) v
shawnt00 10.07.2024 19:42

@shawnt00 получил ошибку: «string_split» не является распознаваемым именем встроенной функции.

mike 10.07.2024 19:46

Никогда, никогда не храните данные в виде элементов, разделенных запятыми. Это принесет вам только много неприятностей.

jarlh 10.07.2024 19:47
select distinct value from tablea cross apply string_split(columna, ',') v Извините. Я, конечно, не сторонник такого способа хранения данных.
shawnt00 10.07.2024 19:49

Вообще, глядя на свою попытку, вы уверены, что вам не нужен просто select distinct columna from tablea?

shawnt00 10.07.2024 19:50

Задавая вопрос, вам необходимо предоставить минимальный воспроизводимый пример: (1) DDL и образец набора данных, т. е. таблицы CREATE плюс инструкции INSERT T-SQL. (2) Что вам нужно сделать, то есть логику и попытку реализации вашего кода в T-SQL. (3) Желаемый результат, основанный на примере данных в пункте 1 выше. (4) Версия вашего SQL-сервера (ВЫБЕРИТЕ @@version;).

Yitzhak Khabinsky 10.07.2024 20:15
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
8
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте следующее решение, основанное на функциях SQL Server XML и XQuery.

Он будет работать, начиная с SQL Server 2012.

Примечательные моменты:

  • CROSS APPLY преобразовать значение столбца в XML.
  • Функция XQuery distinct-values() творит чудеса.

SQL

DECLARE @tbl TABLE (id INT IDENTITY PRIMARY KEY, tokens VARCHAR(1000));
INSERT INTO @tbl (tokens) VALUES 
('a,b,a,b,a,b,a,b'),
('cat,dog,cat');

DECLARE @separator CHAR(1) = ',';

SELECT t.*, c
   , REPLACE(c.query('distinct-values(/root/r)').value('.','VARCHAR(1000)'), SPACE(1), @separator) AS result
FROM @tbl AS t
CROSS APPLY (SELECT TRY_CAST('<root><r><![CDATA[' + 
    REPLACE(tokens, @separator, ']]></r><r><![CDATA[') + 
    ']]></r></root>' AS XML)) AS t1(c);

Выход

идентификатор жетоны результат 1 а, б, а, б, а, б, а, б а, б 2 кот, собака, кот Котопес

Другие вопросы по теме