У меня есть таблица со столбцом 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
Да, вы имеете в виду, что у вас есть одна строка со значением столбца, разделенным запятыми? Возможно, в этом проблема: не храните несколько элементов в одном столбце.
select distinct val from tablea cross apply (select string_split(a)) v
@shawnt00 получил ошибку: «string_split» не является распознаваемым именем встроенной функции.
Никогда, никогда не храните данные в виде элементов, разделенных запятыми. Это принесет вам только много неприятностей.
select distinct value from tablea cross apply string_split(columna, ',') v
Извините. Я, конечно, не сторонник такого способа хранения данных.
Вообще, глядя на свою попытку, вы уверены, что вам не нужен просто select distinct columna from tablea
?
Задавая вопрос, вам необходимо предоставить минимальный воспроизводимый пример: (1) DDL и образец набора данных, т. е. таблицы CREATE плюс инструкции INSERT T-SQL. (2) Что вам нужно сделать, то есть логику и попытку реализации вашего кода в T-SQL. (3) Желаемый результат, основанный на примере данных в пункте 1 выше. (4) Версия вашего SQL-сервера (ВЫБЕРИТЕ @@version;).
Попробуйте следующее решение, основанное на функциях SQL Server XML и XQuery.
Он будет работать, начиная с SQL Server 2012.
Примечательные моменты:
CROSS APPLY
преобразовать значение столбца в XML.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);
Выход
получил ошибку. Оконные функции и функции NEXT VALUE FOR не поддерживают целочисленные индексы в качестве выражений предложения ORDER BY.