powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление повторяющихся цифр из числа
21 сообщений из 21, страница 1 из 1
Удаление повторяющихся цифр из числа
    #40000827
compressor1337
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как удалить все повторяющиеся цифры из числа?
Допустим


Declare @x int
Set @x=11123


и вывести "23" в системные сообщения
...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40000858
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
compressor1337,

шутки для, забавы ради
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
declare @n bigint, @k bigint;
set @n = 111123234546;
set @k = log(@n, 10);

declare @s varchar(100);

with cte as
(
    select 
        @n%10 as num, 
        2 as pwr, 
        @n/10 as nxt
    union all
    select 
        nxt%10, 
        pwr+1, 
        nxt/10
    from 
        cte
    where 
        cte.pwr <= @k
),
res as 
(
    select
        cte.num, 
        cte.pwr, 
        count(*) over (partition by cte.num) cnt
    from
        cte
)
select
    @s = string_agg(num) within group (order by pwr) s
from
    res
where
    cnt = 1
option(maxrecursion 1000);

print(@s);
...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40000869
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
declare @n bigint, @k bigint;
declare @s varchar(100);

set @n = 111123234546;
set @s = cast(@n as varchar);
set @k = len(@s);

with cte as
(
    select
		cast(case when substring(@s, 1, 1) = substring(@s, 2, 1) then '' else substring(@s, 1, 1) end as varchar(30)) f,
        2 i
    union all
    select 
		cast(f+case when substring(@s, i, 1) in (substring(@s, i+1, 1), substring(@s, i-1, 1)) then '' else substring(@s, i, 1) end as varchar(30)) f,
        i+1
    from 
        cte
    where 
        i <= @k
)
select max(f) from cte

...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40000875
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересно
ТС сможет защитить у препода предоставленные варианты?
...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40000985
Агрох
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавлю ещё один вариант:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
WITH R1 AS (
SELECT '12331113134224234864599' AS c
), R2 AS (
  SELECT 2 AS A, CASE WHEN charindex('1', c, charindex('1', c, 1) + 1) > 0 THEN REPLACE(c, '1', '') ELSE c END AS c
  FROM R1
  UNION ALL
  SELECT A + 1 AS A, CASE WHEN charindex(CAST(A AS VARCHAR(1)), c, charindex(CAST(A AS VARCHAR(1)), c, 1) + 1) > 0 THEN REPLACE(c, CAST(A AS VARCHAR(1)), '') ELSE c END AS с
  FROM R2
  WHERE A < 10
)
SELECT 
	c 
FROM R2
WHERE a = 10;
...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40001024
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Херурги... всё б вам резать...

Код: sql
1.
2.
3.
4.
5.
6.
Declare @s varchar(255) = '1112223334445556667778889990001234567890123555666779'

select distinct substring(t.s, v.number, 1)  from 
	(values (@s)) t(s)
	inner join master..spt_values v on type = 'P'
Where substring(t.s, v.number, 1) > ''
...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40001027
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И вот так, если нужно сохранить порядок цифр:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Declare @s varchar(255) = '11192223334445556667778889990001234567890123555666779'

Select tt.n from (
		select top(1) with ties v.number, n.n  from 
			(values (@s)) t(s)
			inner join master..spt_values v on type = 'P'
			cross apply (values (substring(t.s, v.number, 1))) n(n)
		Where n.n > ''
		Order by ROW_NUMBER() over (partition by n.n order by v.number)
		) tt
Order by tt.number
...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40001052
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
интересно
ТС сможет защитить у препода предоставленные варианты?
Сомнительно.
Иначе он бы не халявничал или предложил свои варианты.
...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40001106
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
Херурги... всё б вам резать...

Код: sql
1.
2.
3.
4.
5.
6.
Declare @s varchar(255) = '1112223334445556667778889990001234567890123555666779'

select distinct substring(t.s, v.number, 1)  from 
	(values (@s)) t(s)
	inner join master..spt_values v on type = 'P'
Where substring(t.s, v.number, 1) > ''

что-то результат с примером ТСа не катится
Код: sql
1.
2.
3.
4.
5.
6.
Declare @s varchar(255) = '11123'

select distinct substring(t.s, v.number, 1)  from 
	(values (@s)) t(s)
	inner join master..spt_values v on type = 'P'
Where substring(t.s, v.number, 1) > ''

1 2 и 3 вместо 23
...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40001108
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
uaggster
Херурги... всё б вам резать...

Код: sql
1.
2.
3.
4.
5.
6.
Declare @s varchar(255) = '1112223334445556667778889990001234567890123555666779'

select distinct substring(t.s, v.number, 1)  from 
	(values (@s)) t(s)
	inner join master..spt_values v on type = 'P'
Where substring(t.s, v.number, 1) > ''


что-то результат с примером ТСа не катится
Код: sql
1.
2.
3.
4.
5.
6.
Declare @s varchar(255) = '11123'

select distinct substring(t.s, v.number, 1)  from 
	(values (@s)) t(s)
	inner join master..spt_values v on type = 'P'
Where substring(t.s, v.number, 1) > ''


1 2 и 3 вместо 23



Код: sql
1.
2.
3.
4.
5.
6.
7.
то же самое, но проще

Declare @s varchar(255) = '11123'

select v.number
  from master..spt_values v
 where type = 'P' and v.number < 10 and @s like  '%'+cast(v.number as varchar) +'%'

...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40001266
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx, Слушай, а ведь ты прав!!!
На 100%

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Declare @s varchar(255)='11123'

;with s as (
select v.number, n.n  from 
	(values (@s)) t(s)
	inner join master..spt_values v on type = 'P'
	cross apply (values (substring(t.s, v.number, 1))) n(n)
Where n.n > ''
)
Select s.n from s s left join s s_prev on s.number = s_prev.number + 1 left join s s_next on s.number = s_next.number - 1 
Where not(s.n = isNull(s_next.n,'') or s.n = IsNull(s_prev.n,''))
Order by s.number
...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40001306
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
andreymx, Слушай, а ведь ты прав!!!
На 100%

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Declare @s varchar(255)='11123'

;with s as (
select v.number, n.n  from 
	(values (@s)) t(s)
	inner join master..spt_values v on type = 'P'
	cross apply (values (substring(t.s, v.number, 1))) n(n)
Where n.n > ''
)
Select s.n from s s left join s s_prev on s.number = s_prev.number + 1 left join s s_next on s.number = s_next.number - 1 
Where not(s.n = isNull(s_next.n,'') or s.n = IsNull(s_prev.n,''))
Order by s.number

а я не уверен, что правильно понял вопрос ТС

удаляем повторяющиеся подряд или те, которые встречаются в числе больше одного раза
...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40001484
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Declare @i bigint = 8112535111111111116
Declare @s varchar(255)=concat(@i,@i)
Declare @l int = len(@s)/2
Declare @res varchar(255) = '';

select @res = @res + case when charindex(substring(@s, number, 1), @s, number+1) = number+@l then substring(@s, number, 1) else '' end
  from master..spt_values v
 where v.type = 'P'
   and number between 1 and @l

select @res

8236
...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40002134
ayaya14228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Агрох, а можно как-то сделать чтобы удалялось масимально повторяющееся число? например из 1111223 удалилось бы только 1111 и осталось 223
...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40002142
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ayaya14228
Агрох, а можно как-то сделать чтобы удалялось масимально повторяющееся число? например из 1111223 удалилось бы только 1111 и осталось 223
вы с ТС в одной группе?
...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40002146
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ayaya14228,

Можно
...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40002231
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ayaya14228
Агрох, а можно как-то сделать чтобы удалялось масимально повторяющееся число? например из 1111223 удалилось бы только 1111 и осталось 223
а как быть с числами
123456
111222333444555666
1112111
...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40002429
Агрох
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ayaya14228
Агрох, а можно как-то сделать чтобы удалялось масимально повторяющееся число? например из 1111223 удалилось бы только 1111 и осталось 223


andreymx
а как быть с числами
123456
111222333444555666
1112111


Всё можно. Считаем количество каждой из цифр в числе (думаю так же, рекурсией), затем выбираем только те, чьё количество равно максимальному (оконная функция), затем удаляем обычным REPLACE.
...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40002433
Агрох
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Громоздко получилось, но вроде работает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
WITH R0 AS (
	SELECT '1112223311333' AS c
), R1 AS (
  	SELECT SUBSTRING(c, 1, 1) AS i, SUBSTRING(c, 2, len(c) - 1) AS c, 1 as cnt
  	FROM R0
  	UNION ALL
  	SELECT SUBSTRING(c, 1, 1) AS i, SUBSTRING(c, 2, len(c) - 1) AS c, 1 as cnt
  	FROM R1
  	WHERE len(c) > 0
), R2 AS (
	SELECT i, SUM(cnt) AS cnt, MAX(SUM(cnt)) OVER() AS max_cnt
  	FROM R1
  	GROUP BY i
), R3 AS (
	SELECT ROW_NUMBER() OVER(ORDER BY i) AS RN, i
  	FROM R2
  	WHERE max_cnt = cnt
), R4 AS (
	SELECT REPLACE(c, i, '') AS c, 1 As RN
  	FROM R0, R3
  	WHERE R3.RN = 1
  	UNION ALL
  	SELECT REPLACE(c, i, '') AS c, R4.RN + 1 As RN
  	FROM R4, R3
  	WHERE R3.RN = R4.RN + 1
), R5 AS (
	SELECT c, RN, MAX(RN) OVER() AS MAX_RN
  	FROM R4
)
SELECT c FROM R5 WHERE RN = MAX_RN;



Но если вам реально надо это сдавать куда то, то вас могут завалить на вопроса типа "Объясните как это работает".
Почитайте про рекурсию, оконные функции, агрегаты и функции обработки строк. Ну и про обобщённые табличные выражения, естественно (это то самое WITH, которые тут везде).
...
Рейтинг: 0 / 0
Удаление повторяющихся цифр из числа
    #40002461
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
declare @s varchar(100) = '1112223311333';

with t as
(
 select
  a.s, a.n, 0 as g, cast(b.c1 as varchar(max)) as r, 1 as l
 from
  (select @s, 1) a(s, n) cross apply
  (select substring(a.s, a.n, 1), substring(a.s, a.n - 1, 1)) b(c1, c2)

 union all

 select
  t.s, a.n,
  case when b.c1 = b.c2 then t.g else t.g + 1 end,
  case when b.c1 = b.c2 then r + b.c1 else b.c1 end,
  case when b.c1 = b.c2 then t.l + 1 else 1 end
 from
  t cross apply
  (select t.n + 1) a(n) cross apply
  (select substring(t.s, a.n, 1), substring(t.s, a.n - 1, 1)) b(c1, c2)
 where
  a.n <= len(t.s)
),
t2 as
(
 select
  r, n,
  max(l) over () as ml,
  max(l) over (partition by g) as mlp,
  row_number() over (partition by g order by l desc) as rn
from
 t
)
select
 string_agg(r, '') within group (order by n)
from
 t2
where
 mlp < ml and rn = 1;


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


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