Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление строк с повторяющимися значениями. / 17 сообщений из 17, страница 1 из 1
01.11.2018, 11:47
    #39726422
lopster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк с повторяющимися значениями.
Всем доброго дня.
Есть вот такой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE 
@str VARCHAR (400)='MTA: All Agency Utility Portfolio|MTA: All Agency Utility Portfolio|MTA: All Agency Utility Portfolio|MNCRR|Electric|Constellation|1-ELVHNH|'

;WITH cte
AS(
SELECT value AS val, ROW_NUMBER() OVER (ORDER BY(SELECT 0)) AS rn
FROM  STRING_SPLIT(@str,'|'))
SELECT cte.val,rn
INTO #t
FROM cte 



результатом которого выводится вот такой список:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 
MTA: All Agency Utility Portfolio	1
MTA: All Agency Utility Portfolio	2
MTA: All Agency Utility Portfolio	3
MNCRR                                      4
Electric	                                5
Constellation	                        6
1-ELVHNH	                                7
	                                        8


Суть дальнейших действий состоит в том, чтобы убрать повторяющиеся строки, но при использование,, предположим, Distinct или Group By, сервер по умолчанию применяет сортировку по алфавиту, а это, в данном случае, совершенно не нужно.

Нужно получить что-то типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
MTA: All Agency Utility Portfolio	1
MNCRR	                                2
Electric	                                3
Constellation	                        4
1-ELVHNH                                 5                                        
                                                6


Подскажите, пожалуйста, как это можно реализовать?
Заранее спасибо.
...
Рейтинг: 0 / 0
01.11.2018, 11:50
    #39726426
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк с повторяющимися значениями.
Какая разница, сортировать по алфавиту или по рандому?
...
Рейтинг: 0 / 0
01.11.2018, 12:00
    #39726436
lopster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк с повторяющимися значениями.
Akina, Разница заключается в том, что это уровни иерархии, и чтобы их дальше вывести в столбцы, их порядок по отношению к уровню не должен быть нарушен.
...
Рейтинг: 0 / 0
01.11.2018, 12:18
    #39726456
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк с повторяющимися значениями.
lopsterAkina, Разница заключается в том, что это уровни иерархии, и чтобы их дальше вывести в столбцы, их порядок по отношению к уровню не должен быть нарушен.Чтобы был определённый порядок, должно быть поле, задающее этот порядок. Оно у вас есть?

Дополните OVER() предложением PARTITION BY [value] и оставьте в результате строки с rn=1
...
Рейтинг: 0 / 0
01.11.2018, 12:56
    #39726496
lopster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк с повторяющимися значениями.
iap,

так порядок и задается rn.
Я пробовал это сделать точно так, как вы написали. Не работает.

Запрос из поста можно запустить в любой студии с версией сервера от 2016 и проверить.
...
Рейтинг: 0 / 0
01.11.2018, 13:04
    #39726502
Lissaro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк с повторяющимися значениями.
Может так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DECLARE 
@str VARCHAR (400)='MTA: All Agency Utility Portfolio|MTA: All Agency Utility Portfolio|MTA: All Agency Utility Portfolio|MNCRR|Electric|Constellation|1-ELVHNH|'

;WITH cte
AS(
SELECT value AS val, ROW_NUMBER() OVER (ORDER BY(SELECT 0)) AS rn
FROM  STRING_SPLIT(@str,'|'))
SELECT cte.val,rn,MIN(rn) OVER (PARTITION BY val) AS ff
INTO #t
FROM cte

 SELECT DISTINCT  val, ff
 FROM   #t
 ORDER BY ff
...
Рейтинг: 0 / 0
01.11.2018, 14:30
    #39726595
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк с повторяющимися значениями.
lopsteriap,

так порядок и задается rn.
Я пробовал это сделать точно так, как вы написали. Не работает.

Запрос из поста можно запустить в любой студии с версией сервера от 2016 и проверить.Порядок у вас никак не задаётся! И rn здесь совершенно не при чём.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DECLARE 
@str VARCHAR (400)='MTA: All Agency Utility Portfolio|MTA: All Agency Utility Portfolio|MTA: All Agency Utility Portfolio|MNCRR|Electric|Constellation|1-ELVHNH|';

WITH cte AS
(
 SELECT
  val=value
, rn=ROW_NUMBER() OVER (ORDER BY 1/0)
, n=ROW_NUMBER() OVER (PARTITION BY [value] ORDER BY 1/0)
FROM  STRING_SPLIT(@str,'|')
)
SELECT val,rn
FROM cte
WHERE n=1
ORDER BY rn;
...
Рейтинг: 0 / 0
01.11.2018, 14:39
    #39726611
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк с повторяющимися значениями.
Не пользуйтесь для этой задачи STRING_SPLIT.
Напишите функцию разделения, где будет явно указана позиция item в строке.
Через xml например, или clr-ку напишите.
...
Рейтинг: 0 / 0
01.11.2018, 14:45
    #39726615
lopster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк с повторяющимися значениями.
iap,
Это решение получается только для частного случая.
Если я, допустим, меняю строку:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DECLARE 
@str VARCHAR (400)='bdhg|bdhg|bdhg|aert|kiop|bnmk|1-ELVHNH|';

WITH cte AS
(
 SELECT
  val=value
, rn=ROW_NUMBER() OVER (ORDER BY 1/0)
, n=ROW_NUMBER() OVER (PARTITION BY [value] ORDER BY 1/0)
FROM  STRING_SPLIT(@str,'|')
)
SELECT val,rn
FROM cte
WHERE n=1
ORDER BY rn;


, то результат будет один фиг по алфавиту.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
         val	             rn
	                      1
1-ELVHNH	              2
aert	                      3
bdhg                	      4
bnmk	              7
kiop	                      8
...
Рейтинг: 0 / 0
01.11.2018, 15:33
    #39726661
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк с повторяющимися значениями.
lopster,

значит требуется промежуточное сохранения нумерованного списка.
...
Рейтинг: 0 / 0
01.11.2018, 15:35
    #39726665
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк с повторяющимися значениями.
Или табличную CLR допилите для устранения дублей, которая делает split. В инете можно код найти.
...
Рейтинг: 0 / 0
01.11.2018, 15:35
    #39726666
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк с повторяющимися значениями.
lopster,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DECLARE 
@str VARCHAR (400)='MTA: All Agency Utility Portfolio|MTA: All Agency Utility Portfolio|MTA: All Agency Utility Portfolio|MNCRR|Electric|Constellation|1-ELVHNH|';

with a as
(
 select top (cast(0x7fffffff as int))
  value,
  row_number() over (order by (select 1)) as rn
 from
  STRING_SPLIT(@str,'|')
 order by
  row_number() over (order by (select 1))
)
select value, row_number() over (order by min(rn)) from a group by value;
...
Рейтинг: 0 / 0
01.11.2018, 16:22
    #39726716
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк с повторяющимися значениями.
Еще вариант
Код: sql
1.
2.
3.
4.
5.
6.
7.
select
 value,
 row_number() over (order by charindex('|' + value + '|', '|' + @str + '|'))
from
 STRING_SPLIT(@str,'|')
group by
 value;
...
Рейтинг: 0 / 0
01.11.2018, 16:46
    #39726731
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк с повторяющимися значениями.
uaggsterНе пользуйтесь для этой задачи STRING_SPLIT.
Напишите функцию разделения, где будет явно указана позиция item в строке.
Через xml например, или clr-ку напишите.Всё давно написано:
Функция, которая делит строку на слова
...
Рейтинг: 0 / 0
01.11.2018, 21:29
    #39726854
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк с повторяющимися значениями.
Владислав Колосовзначит требуется промежуточное сохранения нумерованного списка.

Правильно ли я понял, что это особенность запросов с подзапросами, что нумерация ROW_NUMBER может примениться не внутри подзапроса/сте, а позже, при окончательной выборке, как происходит у ТС?
...
Рейтинг: 0 / 0
02.11.2018, 11:09
    #39727072
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк с повторяющимися значениями.
PizzaPizza,

Сервер не рассматривает CTE как отдельно выполняющиеся запросы, а строит общий план выполнения. Поэтому и возникают проблемы с сортировками казалось бы верного выражения.
...
Рейтинг: 0 / 0
02.11.2018, 20:02
    #39727413
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк с повторяющимися значениями.
Владислав КолосовPizzaPizza,

Сервер не рассматривает CTE как отдельно выполняющиеся запросы, а строит общий план выполнения. Поэтому и возникают проблемы с сортировками казалось бы верного выражения.

Ага. То есть в данном случае сервер решил, что ему удобнее и проще так выполнить запрос. А есть ли хинты, помимо выноса в табличную переменную или временную таблицу, что бы форсить выполнение row_number внутри подзапроса в случае ТС?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление строк с повторяющимися значениями. / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]