Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 ранжировать переменное количество значений  [new]
linav
Guest
здравствуйте
ребята, подскажите пожалуйста, как сделать такую задачу: необходимо ранжировать значения с шагом каждой группы не менее 0.1, но так, чтобы в каждой строке получилось от 8 до 15 значений, если конечно нет большого количества повторяющихся значений, то только в этом случае можно получить больше значений в одну строку
но в общем-то ничего страшного, если шаг тоже будет меняться в разных группах по разному, лишь бы держаться в заданном количестве значений в строке
ну так, чтобы, например, для этих значений
11.43;11.44;11.50;11.95;12.00;12.01;12.37;12.38;12.41;12.44;12.47;12.48;12.49;12.52;12.53;12.53;12.53;12.53
получилось так:
1-й диапазон значений:11.43;11.44;11.50;11.95;12.00;12.01;12.37;12.38;'min:';'max:12.38'
2-й диапазон значений:12.41;12.44;12.47;12.48;12.49;12.52;12.53;12.53;12.53;12.53;'min:12.41';'max:12.53'

пыталась для начала так, но не ничего получилось:
+
if object_id('tempdb..#t') is not null drop table #t
create table #t (
	id int not null identity
	, weight decimal(9,4)
	primary key clustered (id))
insert into #t (weight) values
		 (15.39)
		,(11.50)
		,(12.70)
		,(12.59)
		,(12.72)
		,(12.72)
		,(12.69)
		,(12.74)
		,(12.56)
		,(12.68)
		,(12.77)
		,(12.67)
		,(12.75)
		,(12.75)
		,(12.68)
		,(12.60)
		,(12.80)
		,(15.62)
		,(15.64)
		,(20.05)
		,(19.59)
		,(19.92)
		,(19.95)
		,(20.05)
		,(20.06)
		,(19.96)
		,(20.04)
		,(19.94)
		,(20.06)
		,(20.03)
		,(19.95)
		,(19.97)
		,(20.00)
		,(20.00)
		,(19.98)
		,(20.02)
		,(15.85)
		,(20.02)
		,(19.99)
		,(19.68)
		,(20.02)
		,(15.78)
		,(19.48)
		,(20.01)
		,(20.00)
		,(19.95)
		,(22.72)
		,(19.91)
		,(19.95)
		,(19.93)
		,(19.90)
		,(20.06)
		,(19.94)
		,(19.99)
		,(19.93)
		,(19.97)
		,(20.05)
		,(19.73)
		,(19.92)
		,(20.01)
		,(19.92)
		,(19.93)
		,(19.99)
		,(20.01)
		,(19.98)
		,(16.31)
		,(22.05)
		,(19.95)
		,(20.04)
		,(19.78)
		,(20.02)
		,(19.99)
		,(19.96)
		,(20.00)
		,(20.00)
		,(20.00)
		,(14.67)
		,(15.44)
		,(14.05)
		,(13.97)
		,(14.11)
		,(15.50)
		,(14.11)
		,(15.47)
		,(15.52)
		,(15.56)
		,(17.67)
		,(15.36)
		,(15.34)
		,(15.42)
		,(15.34)
		,(15.37)
		,(15.10)
		,(20.32)
		,(15.36)
		,(15.39)
		,(15.29)
		,(15.40)
		,(15.40)
		,(15.39)
		,(15.34)
		,(15.37)
		,(00.64)
		,(15.86)
		,(15.97)
		,(15.82)
		,(15.77)
		,(15.73)
		,(15.92)
		,(15.87)
		,(15.85)
		,(15.78)
		,(15.56)
		,(15.91)
		,(15.86)
		,(15.97)
		,(15.74)
		,(15.83)
		,(15.78)
		,(14.26)
		,(15.77)
		,(14.24)
		,(14.26)
		,(14.26)
		,(14.26)
		,(14.32)
		,(13.01)
		,(13.17)
		,(13.15)
		,(13.19)
		,(13.09)
		,(13.10)
		,(13.09)
		,(13.26)
		,(13.17)
		,(13.20)
		,(13.18)
		,(13.07)
		,(13.18)
		,(13.11)
		,(13.11)
		,(13.17)
		,(13.11)
		,(13.11)
		,(13.07)
		,(12.88)
		,(12.97)
		,(12.96)
		,(12.92)
		,(12.88)
		,(22.38)
		,(00.36)
		,(00.40)
		,(00.35)
		,(00.41)
		,(00.41)
		,(00.36)
		,(00.34)
		,(00.00)
		,(22.04)
		,(16.29)
		,(12.64)
		,(12.59)
		,(12.59)
		,(12.68)
		,(12.57)
		,(12.54)
		,(12.37)
		,(12.63)
		,(12.64)
		,(12.66)
		,(12.54)
		,(12.63)
		,(12.64)
		,(12.62)
		,(12.62)
		,(12.64)
		,(12.58)
		,(12.61)
		,(12.64)
		,(12.48)
		,(12.64)
		,(12.62)
		,(12.59)
		,(12.61)
		,(12.60)
		,(12.60)
		,(12.58)
		,(12.79)
		,(18.77)
		,(12.78)
		,(12.57)
		,(12.49)
		,(12.54)
		,(12.60)
		,(12.60)
		,(12.57)
		,(12.63)
		,(12.62)
		,(12.62)
		,(12.59)
		,(18.30)
		,(12.64)
		,(12.61)
		,(12.53)
		,(12.53)
		,(12.72)
		,(12.75)
		,(12.65)
		,(12.53)
		,(12.78)
		,(12.80)
		,(12.59)
		,(12.54)
		,(12.72)
		,(12.79)
		,(12.74)
		,(12.77)
		,(12.69)
		,(12.56)
		,(12.85)
		,(12.72)
		,(12.72)
		,(12.70)
		,(00.00)
		,(12.71)
		,(13.81)
		,(13.84)
		,(12.77)
		,(12.74)
		,(13.83)
		,(13.83)
		,(16.97)
		,(17.06)
		,(17.28)
		,(17.22)
		,(12.78)
		,(12.63)
		,(12.57)
		,(12.69)
		,(12.52)
		,(12.72)
		,(11.43)
		,(12.65)
		,(12.70)
		,(12.64)
		,(12.65)
		,(12.67)
		,(12.58)
		,(12.63)
		,(11.44)
		,(12.70)
		,(12.47)
		,(12.65)
		,(12.68)
		,(12.65)
		,(12.60)
		,(12.61)
		,(12.64)
		,(12.63)
		,(12.66)
		,(12.59)
		,(12.61)
		,(12.64)
		,(12.64)
		,(12.67)
		,(12.38)
		,(12.63)
		,(12.59)
		,(12.64)
		,(12.65)
		,(12.58)
		,(12.56)
		,(12.62)
		,(12.62)
		,(12.41)
		,(12.65)
		,(12.53)
		,(12.60)
		,(12.63)
		,(12.59)
		,(12.61)
		,(12.63)
		,(12.54)
		,(12.64)
		,(13.91)
		,(12.63)
		,(12.44)
		,(12.54)
		,(12.63)
		,(12.62)
		,(12.56)
		,(12.60)
		,(17.16)
		,(12.65)
		,(17.12)
		,(12.58)
		,(12.60)
		,(12.57)
		,(12.60)
		,(12.76)
		,(12.70)
		,(12.69)
		,(12.66)
		,(12.76)
		,(12.75)
		,(12.76)
		,(12.71)
		,(12.70)
		,(12.74)
		,(12.70)
		,(12.74)
		,(12.72)
		,(12.68)
		,(12.81)
		,(12.68)
		,(12.65)
		,(12.74)
		,(12.74)
		,(12.72)
		,(12.66)
		,(11.95)
		,(12.01)
		,(12.00)

;with part as
(
select 
		  t.id
		, t.weight 
		, 1 as range_level
	from #t t
	where 
		weight >= (select min(weight) from #t) 
		and 
		weight < (select min(weight) from #t) + .1
union all
select 
		  p.id
		, p.weight
		, p.range_level + 1
	from part p
	where 
		weight >= (select max(weight) from p) 
		and 
		weight < (select max(weight) from p) + .1
)
select * from part
25 авг 14, 09:10    [16486708]     Ответить | Цитировать Сообщить модератору
 Re: ранжировать переменное количество значений  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
+
if object_id('tempdb..#t') is not null drop table #t
create table #t (
	id int not null identity
	, weight decimal(9,4)
	primary key clustered (id))
insert into #t (weight) values
		 (15.39)
		,(11.50)
		,(12.70)
		,(12.59)
		,(12.72)
		,(12.72)
		,(12.69)
		,(12.74)
		,(12.56)
		,(12.68)
		,(12.77)
		,(12.67)
		,(12.75)
		,(12.75)
		,(12.68)
		,(12.60)
		,(12.80)
		,(15.62)
		,(15.64)
		,(20.05)
		,(19.59)
		,(19.92)
		,(19.95)
		,(20.05)
		,(20.06)
		,(19.96)
		,(20.04)
		,(19.94)
		,(20.06)
		,(20.03)
		,(19.95)
		,(19.97)
		,(20.00)
		,(20.00)
		,(19.98)
		,(20.02)
		,(15.85)
		,(20.02)
		,(19.99)
		,(19.68)
		,(20.02)
		,(15.78)
		,(19.48)
		,(20.01)
		,(20.00)
		,(19.95)
		,(22.72)
		,(19.91)
		,(19.95)
		,(19.93)
		,(19.90)
		,(20.06)
		,(19.94)
		,(19.99)
		,(19.93)
		,(19.97)
		,(20.05)
		,(19.73)
		,(19.92)
		,(20.01)
		,(19.92)
		,(19.93)
		,(19.99)
		,(20.01)
		,(19.98)
		,(16.31)
		,(22.05)
		,(19.95)
		,(20.04)
		,(19.78)
		,(20.02)
		,(19.99)
		,(19.96)
		,(20.00)
		,(20.00)
		,(20.00)
		,(14.67)
		,(15.44)
		,(14.05)
		,(13.97)
		,(14.11)
		,(15.50)
		,(14.11)
		,(15.47)
		,(15.52)
		,(15.56)
		,(17.67)
		,(15.36)
		,(15.34)
		,(15.42)
		,(15.34)
		,(15.37)
		,(15.10)
		,(20.32)
		,(15.36)
		,(15.39)
		,(15.29)
		,(15.40)
		,(15.40)
		,(15.39)
		,(15.34)
		,(15.37)
		,(00.64)
		,(15.86)
		,(15.97)
		,(15.82)
		,(15.77)
		,(15.73)
		,(15.92)
		,(15.87)
		,(15.85)
		,(15.78)
		,(15.56)
		,(15.91)
		,(15.86)
		,(15.97)
		,(15.74)
		,(15.83)
		,(15.78)
		,(14.26)
		,(15.77)
		,(14.24)
		,(14.26)
		,(14.26)
		,(14.26)
		,(14.32)
		,(13.01)
		,(13.17)
		,(13.15)
		,(13.19)
		,(13.09)
		,(13.10)
		,(13.09)
		,(13.26)
		,(13.17)
		,(13.20)
		,(13.18)
		,(13.07)
		,(13.18)
		,(13.11)
		,(13.11)
		,(13.17)
		,(13.11)
		,(13.11)
		,(13.07)
		,(12.88)
		,(12.97)
		,(12.96)
		,(12.92)
		,(12.88)
		,(22.38)
		,(00.36)
		,(00.40)
		,(00.35)
		,(00.41)
		,(00.41)
		,(00.36)
		,(00.34)
		,(00.00)
		,(22.04)
		,(16.29)
		,(12.64)
		,(12.59)
		,(12.59)
		,(12.68)
		,(12.57)
		,(12.54)
		,(12.37)
		,(12.63)
		,(12.64)
		,(12.66)
		,(12.54)
		,(12.63)
		,(12.64)
		,(12.62)
		,(12.62)
		,(12.64)
		,(12.58)
		,(12.61)
		,(12.64)
		,(12.48)
		,(12.64)
		,(12.62)
		,(12.59)
		,(12.61)
		,(12.60)
		,(12.60)
		,(12.58)
		,(12.79)
		,(18.77)
		,(12.78)
		,(12.57)
		,(12.49)
		,(12.54)
		,(12.60)
		,(12.60)
		,(12.57)
		,(12.63)
		,(12.62)
		,(12.62)
		,(12.59)
		,(18.30)
		,(12.64)
		,(12.61)
		,(12.53)
		,(12.53)
		,(12.72)
		,(12.75)
		,(12.65)
		,(12.53)
		,(12.78)
		,(12.80)
		,(12.59)
		,(12.54)
		,(12.72)
		,(12.79)
		,(12.74)
		,(12.77)
		,(12.69)
		,(12.56)
		,(12.85)
		,(12.72)
		,(12.72)
		,(12.70)
		,(00.00)
		,(12.71)
		,(13.81)
		,(13.84)
		,(12.77)
		,(12.74)
		,(13.83)
		,(13.83)
		,(16.97)
		,(17.06)
		,(17.28)
		,(17.22)
		,(12.78)
		,(12.63)
		,(12.57)
		,(12.69)
		,(12.52)
		,(12.72)
		,(11.43)
		,(12.65)
		,(12.70)
		,(12.64)
		,(12.65)
		,(12.67)
		,(12.58)
		,(12.63)
		,(11.44)
		,(12.70)
		,(12.47)
		,(12.65)
		,(12.68)
		,(12.65)
		,(12.60)
		,(12.61)
		,(12.64)
		,(12.63)
		,(12.66)
		,(12.59)
		,(12.61)
		,(12.64)
		,(12.64)
		,(12.67)
		,(12.38)
		,(12.63)
		,(12.59)
		,(12.64)
		,(12.65)
		,(12.58)
		,(12.56)
		,(12.62)
		,(12.62)
		,(12.41)
		,(12.65)
		,(12.53)
		,(12.60)
		,(12.63)
		,(12.59)
		,(12.61)
		,(12.63)
		,(12.54)
		,(12.64)
		,(13.91)
		,(12.63)
		,(12.44)
		,(12.54)
		,(12.63)
		,(12.62)
		,(12.56)
		,(12.60)
		,(17.16)
		,(12.65)
		,(17.12)
		,(12.58)
		,(12.60)
		,(12.57)
		,(12.60)
		,(12.76)
		,(12.70)
		,(12.69)
		,(12.66)
		,(12.76)
		,(12.75)
		,(12.76)
		,(12.71)
		,(12.70)
		,(12.74)
		,(12.70)
		,(12.74)
		,(12.72)
		,(12.68)
		,(12.81)
		,(12.68)
		,(12.65)
		,(12.74)
		,(12.74)
		,(12.72)
		,(12.66)
		,(11.95)
		,(12.01)
		,(12.00)

;WITH t as (select top 100 percent CAST([weight] as varchar(20)) as [weight], dense_rank() OVER(order by floor([weight]/0.1)) as gr from #t order by [weight])
SELECT T.gr
,STUFF((SELECT N', '+[weight] FROM t TT WHERE TT.gr=T.gr ORDER BY TT.[weight] FOR XML PATH(''), TYPE).value(N'.',N'NVARCHAR(MAX)'),1,2,N'') [weights]
FROM t 
GROUP BY T.gr
ORDER BY T.gr


Сообщение было отредактировано: 25 авг 14, 12:40
25 авг 14, 11:24    [16487373]     Ответить | Цитировать Сообщить модератору
 Re: ранжировать переменное количество значений  [new]
linav
Guest
LexusR, спасибо!
в особенности спасибо за подсказку с dense_rank() OVER(order by floor([weight]/0.1)) :)
хотя само решение не очень пока подходит
главное было, чтобы в строке было не более 15 значений, минимум не так критичен (хотя не обязательно в строке, хоть в столбец можно делать а потом уже pivot-ом переверну)

вообще задача так выглядит: все эти значения (кроме ошибочных =0) это вес продукции приходящий с контроллера, но так как в момент провески нет контроля идентификации продукции, а просто после провески весовщик выходит и вручную маркирует, а затем согласно маркировке заполняет вес. чтобы по большому списку глазами не бегать, попросили сделать такого вида табличку, а из нее уже сделаю форму:
вес от и до | вес 1 | вес 2 | вес 3 |.... | вес 15
10.00...10.20 10.01 10.01 10.03 .... 10.20
10.21...10.80 10.35 10.50 10.80 ....
10.81...11.00

т.е. диапазон значений в каждой строке не столь принципиален, а вот количество значений в строке желательно варьировать от 8 до 15, как-то так
25 авг 14, 11:55    [16487594]     Ответить | Цитировать Сообщить модератору
 Re: ранжировать переменное количество значений  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
по 15 в ряд :)
+
if object_id('tempdb..#t') is not null drop table #t
create table #t (
	id int not null identity
	, weight decimal(9,4)
	primary key clustered (id))
insert into #t (weight) values
		 (15.39)
		,(11.50)
		,(12.70)
		,(12.59)
		,(12.72)
		,(12.72)
		,(12.69)
		,(12.74)
		,(12.56)
		,(12.68)
		,(12.77)
		,(12.67)
		,(12.75)
		,(12.75)
		,(12.68)
		,(12.60)
		,(12.80)
		,(15.62)
		,(15.64)
		,(20.05)
		,(19.59)
		,(19.92)
		,(19.95)
		,(20.05)
		,(20.06)
		,(19.96)
		,(20.04)
		,(19.94)
		,(20.06)
		,(20.03)
		,(19.95)
		,(19.97)
		,(20.00)
		,(20.00)
		,(19.98)
		,(20.02)
		,(15.85)
		,(20.02)
		,(19.99)
		,(19.68)
		,(20.02)
		,(15.78)
		,(19.48)
		,(20.01)
		,(20.00)
		,(19.95)
		,(22.72)
		,(19.91)
		,(19.95)
		,(19.93)
		,(19.90)
		,(20.06)
		,(19.94)
		,(19.99)
		,(19.93)
		,(19.97)
		,(20.05)
		,(19.73)
		,(19.92)
		,(20.01)
		,(19.92)
		,(19.93)
		,(19.99)
		,(20.01)
		,(19.98)
		,(16.31)
		,(22.05)
		,(19.95)
		,(20.04)
		,(19.78)
		,(20.02)
		,(19.99)
		,(19.96)
		,(20.00)
		,(20.00)
		,(20.00)
		,(14.67)
		,(15.44)
		,(14.05)
		,(13.97)
		,(14.11)
		,(15.50)
		,(14.11)
		,(15.47)
		,(15.52)
		,(15.56)
		,(17.67)
		,(15.36)
		,(15.34)
		,(15.42)
		,(15.34)
		,(15.37)
		,(15.10)
		,(20.32)
		,(15.36)
		,(15.39)
		,(15.29)
		,(15.40)
		,(15.40)
		,(15.39)
		,(15.34)
		,(15.37)
		,(00.64)
		,(15.86)
		,(15.97)
		,(15.82)
		,(15.77)
		,(15.73)
		,(15.92)
		,(15.87)
		,(15.85)
		,(15.78)
		,(15.56)
		,(15.91)
		,(15.86)
		,(15.97)
		,(15.74)
		,(15.83)
		,(15.78)
		,(14.26)
		,(15.77)
		,(14.24)
		,(14.26)
		,(14.26)
		,(14.26)
		,(14.32)
		,(13.01)
		,(13.17)
		,(13.15)
		,(13.19)
		,(13.09)
		,(13.10)
		,(13.09)
		,(13.26)
		,(13.17)
		,(13.20)
		,(13.18)
		,(13.07)
		,(13.18)
		,(13.11)
		,(13.11)
		,(13.17)
		,(13.11)
		,(13.11)
		,(13.07)
		,(12.88)
		,(12.97)
		,(12.96)
		,(12.92)
		,(12.88)
		,(22.38)
		,(00.36)
		,(00.40)
		,(00.35)
		,(00.41)
		,(00.41)
		,(00.36)
		,(00.34)
		,(00.00)
		,(22.04)
		,(16.29)
		,(12.64)
		,(12.59)
		,(12.59)
		,(12.68)
		,(12.57)
		,(12.54)
		,(12.37)
		,(12.63)
		,(12.64)
		,(12.66)
		,(12.54)
		,(12.63)
		,(12.64)
		,(12.62)
		,(12.62)
		,(12.64)
		,(12.58)
		,(12.61)
		,(12.64)
		,(12.48)
		,(12.64)
		,(12.62)
		,(12.59)
		,(12.61)
		,(12.60)
		,(12.60)
		,(12.58)
		,(12.79)
		,(18.77)
		,(12.78)
		,(12.57)
		,(12.49)
		,(12.54)
		,(12.60)
		,(12.60)
		,(12.57)
		,(12.63)
		,(12.62)
		,(12.62)
		,(12.59)
		,(18.30)
		,(12.64)
		,(12.61)
		,(12.53)
		,(12.53)
		,(12.72)
		,(12.75)
		,(12.65)
		,(12.53)
		,(12.78)
		,(12.80)
		,(12.59)
		,(12.54)
		,(12.72)
		,(12.79)
		,(12.74)
		,(12.77)
		,(12.69)
		,(12.56)
		,(12.85)
		,(12.72)
		,(12.72)
		,(12.70)
		,(00.00)
		,(12.71)
		,(13.81)
		,(13.84)
		,(12.77)
		,(12.74)
		,(13.83)
		,(13.83)
		,(16.97)
		,(17.06)
		,(17.28)
		,(17.22)
		,(12.78)
		,(12.63)
		,(12.57)
		,(12.69)
		,(12.52)
		,(12.72)
		,(11.43)
		,(12.65)
		,(12.70)
		,(12.64)
		,(12.65)
		,(12.67)
		,(12.58)
		,(12.63)
		,(11.44)
		,(12.70)
		,(12.47)
		,(12.65)
		,(12.68)
		,(12.65)
		,(12.60)
		,(12.61)
		,(12.64)
		,(12.63)
		,(12.66)
		,(12.59)
		,(12.61)
		,(12.64)
		,(12.64)
		,(12.67)
		,(12.38)
		,(12.63)
		,(12.59)
		,(12.64)
		,(12.65)
		,(12.58)
		,(12.56)
		,(12.62)
		,(12.62)
		,(12.41)
		,(12.65)
		,(12.53)
		,(12.60)
		,(12.63)
		,(12.59)
		,(12.61)
		,(12.63)
		,(12.54)
		,(12.64)
		,(13.91)
		,(12.63)
		,(12.44)
		,(12.54)
		,(12.63)
		,(12.62)
		,(12.56)
		,(12.60)
		,(17.16)
		,(12.65)
		,(17.12)
		,(12.58)
		,(12.60)
		,(12.57)
		,(12.60)
		,(12.76)
		,(12.70)
		,(12.69)
		,(12.66)
		,(12.76)
		,(12.75)
		,(12.76)
		,(12.71)
		,(12.70)
		,(12.74)
		,(12.70)
		,(12.74)
		,(12.72)
		,(12.68)
		,(12.81)
		,(12.68)
		,(12.65)
		,(12.74)
		,(12.74)
		,(12.72)
		,(12.66)
		,(11.95)
		,(12.01)
		,(12.00)

;WITH t as (select [weight], dense_rank() OVER(order by floor(N/15)) as gr from
(select CAST([weight] as varchar(20)) as [weight], row_number() over(order by [weight]) as N from #t)t)
SELECT T.gr
,STUFF((SELECT N', '+[weight] FROM t TT WHERE TT.gr=T.gr ORDER BY TT.[weight] FOR XML PATH(''), TYPE).value(N'.',N'NVARCHAR(MAX)'),1,2,N'') [weights]
FROM t 
GROUP BY T.gr
ORDER BY T.gr


Сообщение было отредактировано: 25 авг 14, 12:41
25 авг 14, 12:12    [16487744]     Ответить | Цитировать Сообщить модератору
 Re: ранжировать переменное количество значений  [new]
linav
Guest
ну не так же прям строго по 15 и все :)
спасибо Вам, LexusR!
попытаюсь на основе вашей идеи что-нибудь изобрести
25 авг 14, 12:19    [16487785]     Ответить | Цитировать Сообщить модератору
 Re: ранжировать переменное количество значений  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
LexusR,

Модератор: Убирайте, пожалуйста, длинные портянки кода в тег [spoiler]
25 авг 14, 12:42    [16487941]     Ответить | Цитировать Сообщить модератору
 Re: ранжировать переменное количество значений  [new]
linav
Guest
ну что-то голову сломала, но так и не догадалась, как мне решить мою задачу, подскажите, пожалуйста, куда копать
т.е. конечно же с помощью курсоров вообще без проблем, но думала попробовать обойтись без них, хотя тут, возможно зря я от курсоров пытаюсь избавиться, ведь значений больше 500 быть не может, что скажите?

желаемый результат внизу скрипта
как хочу получить: в поля val(x) таблицы result желательно, чтобы заполнялись от 1 до 15, но
1. с одним значением rank_id в каждой строчке начинается и если не заканчивается, то переходит на следующую строчку, но там уже с новым значением rank_id данных не должно быть, т.е. тогда остальные значения в строке =0
2. в одной строке могут быть с разными rank_id, если они помещаются только в одну строчку
+

if object_id('tempdb..#t') is not null drop table #t
if object_id('tempdb..#t1') is not null drop table #t1
if object_id('tempdb..#t2') is not null drop table #t2
if object_id('tempdb..#result') is not null drop table #result
create table #t (
	   id int not null identity
	, [weight] decimal(9,4)
	primary key clustered (id))
insert into #t ([weight]) values
		 (15.39),(11.50),(12.70),(12.59),(12.72),(12.72),(12.69),(12.74),(12.56)
		,(12.68),(12.77),(12.67),(12.75),(12.75),(12.68),(12.60),(12.80),(15.62)
		,(15.64),(20.05),(19.59),(19.92),(19.95),(20.05),(20.06),(19.96),(20.04)
		,(19.94),(20.06),(20.03),(19.95),(19.97),(20.00),(20.00),(19.98),(20.02)
		,(15.85),(20.02),(19.99),(19.68),(20.02),(15.78),(19.48),(20.01),(20.00)
		,(19.95),(22.72),(19.91),(19.95),(19.93),(19.90),(20.06),(19.94),(19.99)
		,(19.93),(19.97),(20.05),(19.73),(19.92),(20.01),(19.92),(19.93),(19.99)
		,(20.01),(19.98),(16.31),(22.05),(19.95),(20.04),(19.78),(20.02),(19.99)
		,(19.96),(20.00),(20.00),(20.00),(14.67),(15.44),(14.05),(13.97),(14.11)
		,(15.50),(14.11),(15.47),(15.52),(15.56),(17.67),(15.36),(15.34),(15.42)
		,(15.34),(15.37),(15.10),(20.32),(15.36),(15.39),(15.29),(15.40),(15.40)
		,(15.39),(15.34),(15.37),(00.64),(15.86),(15.97),(15.82),(15.77),(15.73)
		,(15.92),(15.87),(15.85),(15.78),(15.56),(15.91),(15.86),(15.97),(15.74)
		,(15.83),(15.78),(14.26),(15.77),(14.24),(14.26),(14.26),(14.26),(14.32)
		,(13.01),(13.17),(13.15),(13.19),(13.09),(13.10),(13.09),(13.26),(13.17)
		,(13.20),(13.18),(13.07),(13.18),(13.11),(13.11),(13.17),(13.11),(13.11)
		,(13.07),(12.88),(12.97),(12.96),(12.92),(12.88),(22.38),(00.36),(00.40)
		,(00.35),(00.41),(00.41),(00.36),(00.34),(00.00),(22.04),(16.29),(12.64)
		,(12.59),(12.59),(12.68),(12.57),(12.54),(12.37),(12.63),(12.64),(12.66)
		,(12.54),(12.63),(12.64),(12.62),(12.62),(12.64),(12.58),(12.61),(12.64)
		,(12.48),(12.64),(12.62),(12.59),(12.61),(12.60),(12.60),(12.58),(12.79)
		,(18.77),(12.78),(12.57),(12.49),(12.54),(12.60),(12.60),(12.57),(12.63)
		,(12.62),(12.62),(12.59),(18.30),(12.64),(12.61),(12.53),(12.53),(12.72)
		,(12.75),(12.65),(12.53),(12.78),(12.80),(12.59),(12.54),(12.72),(12.79)
		,(12.74),(12.77),(12.69),(12.56),(12.85),(12.72),(12.72),(12.70),(00.00)
		,(12.71),(13.81),(13.84),(12.77),(12.74),(13.83),(13.83),(16.97),(17.06)
		,(17.28),(17.22),(12.78),(12.63),(12.57),(12.69),(12.52),(12.72),(11.43)
		,(12.65),(12.70),(12.64),(12.65),(12.67),(12.58),(12.63),(11.44),(12.70)
		,(12.47),(12.65),(12.68),(12.65),(12.60),(12.61),(12.64),(12.63),(12.66)
		,(12.59),(12.61),(12.64),(12.64),(12.67),(12.38),(12.63),(12.59),(12.64)
		,(12.65),(12.58),(12.56),(12.62),(12.62),(12.41),(12.65),(12.53),(12.60)
		,(12.63),(12.59),(12.61),(12.63),(12.54),(12.64),(13.91),(12.63),(12.44)
		,(12.54),(12.63),(12.62),(12.56),(12.60),(17.16),(12.65),(17.12),(12.58)
		,(12.60),(12.57),(12.60),(12.76),(12.70),(12.69),(12.66),(12.76),(12.75)
		,(12.76),(12.71),(12.70),(12.74),(12.70),(12.74),(12.72),(12.68),(12.81)
		,(12.68),(12.65),(12.74),(12.74),(12.72),(12.66),(11.95),(12.01),(12.00)

select 
		  [weight]
		, id
		, dense_rank() over(order by floor([weight]/0.1)) as rank_id
	into #t1
	from #t
	where [weight] <> 0 and [weight] > 1
	order by rank_id, [weight]

select count(rank_id) qty, rank_id into #t2 from #t1 group by rank_id

--select rank_id, qty from #t2 order by rank_id 

select t.rank_id, t.qty, i.[weight] from #t2 t inner join #t1 i on t.rank_id = i.rank_id-- order by qty desc


-------------- result -----------------------------------------------------------
create table #result (
	  range_from decimal(9,4) not null
	, range_to decimal(9,4) not null
	, val1 decimal(9,4)
	, val2 decimal(9,4)
	, val3 decimal(9,4)
	, val4 decimal(9,4)
	, val5 decimal(9,4)
	, val6 decimal(9,4)
	, val7 decimal(9,4)
	, val8 decimal(9,4)
	, val9 decimal(9,4)
	, val10 decimal(9,4)
	, val11 decimal(9,4)
	, val12 decimal(9,4)
	, val13 decimal(9,4)
	, val14 decimal(9,4)
	, val15 decimal(9,4)
	)
	
insert into #result 
	(val1 , val2 , val3 , val4 , val5 , val6 , val7 , val8 , val9 , val10, val11, val12, val13, val14, val15, range_from, range_to)
	values
	(11.43, 11.44, 11.50, 11.95, 12.00, 12.01, 12.37, 12.38, 12.41, 12.44, 12.47, 12.48, 12.49,     0,     0,      11.43,    12.49),
	(12.52, 12.53, 12.53, 12.53, 12.53, 12.54, 12.54, 12.54, 12.54, 12.54, 12.54, 12.56, 12.56, 12.56, 12.56,      12.52,    12.56),
	(12.57, 12.57, 12.57, 12.57, 12.57, 12.58, 12.58, 12.58, 12.58, 12.58, 12.59, 12.59, 12.59, 12.59, 12.59,      12.57,    12.59),
	(12.59, 12.59, 12.59, 12.59,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,      12.59,    12.59)
        --, (........)
	
select * from #result --- желаемый результат
26 авг 14, 14:16    [16494061]     Ответить | Цитировать Сообщить модератору
 Re: ранжировать переменное количество значений  [new]
linav
Guest
хотя, если совсем в идеале, то еще одно условие, если много одинаковых значений, то их тоже нужно выносить в отдельную строчку и разделять на несколько строчек, даже независимо от того, что они в один range_id входят
под много подразумевается от 15 и более
но это уже совсем в идеале
26 авг 14, 14:28    [16494178]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить