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


Declare @x int
Set @x=11123


и вывести "23" в системные сообщения
...
Рейтинг: 0 / 0
21.09.2020, 12:57
    #40000858
env
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
21.09.2020, 13:32
    #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
21.09.2020, 13:43
    #40000875
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление повторяющихся цифр из числа
интересно
ТС сможет защитить у препода предоставленные варианты?
...
Рейтинг: 0 / 0
21.09.2020, 15:41
    #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
21.09.2020, 16:14
    #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
21.09.2020, 16:19
    #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
21.09.2020, 16:58
    #40001052
Alexander Us
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление повторяющихся цифр из числа
andreymx
интересно
ТС сможет защитить у препода предоставленные варианты?
Сомнительно.
Иначе он бы не халявничал или предложил свои варианты.
...
Рейтинг: 0 / 0
21.09.2020, 20:08
    #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
21.09.2020, 20:14
    #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
22.09.2020, 13:10
    #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
22.09.2020, 14:13
    #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
22.09.2020, 22:50
    #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
24.09.2020, 13:53
    #40002134
ayaya14228
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление повторяющихся цифр из числа
Агрох, а можно как-то сделать чтобы удалялось масимально повторяющееся число? например из 1111223 удалилось бы только 1111 и осталось 223
...
Рейтинг: 0 / 0
24.09.2020, 14:18
    #40002142
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление повторяющихся цифр из числа
ayaya14228
Агрох, а можно как-то сделать чтобы удалялось масимально повторяющееся число? например из 1111223 удалилось бы только 1111 и осталось 223
вы с ТС в одной группе?
...
Рейтинг: 0 / 0
24.09.2020, 14:22
    #40002146
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление повторяющихся цифр из числа
ayaya14228,

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


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


Всё можно. Считаем количество каждой из цифр в числе (думаю так же, рекурсией), затем выбираем только те, чьё количество равно максимальному (оконная функция), затем удаляем обычным REPLACE.
...
Рейтинг: 0 / 0
25.09.2020, 10:14
    #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
25.09.2020, 11:39
    #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
25.09.2020, 11:48
    #40002468
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление повторяющихся цифр из числа
Просьба, преподавателю отметиться в теме.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление повторяющихся цифр из числа / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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