Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сортировка трех переменных и перезапись в таблицу  [new]
_Промешан_
Member

Откуда:
Сообщений: 970
Таблица многомилионная.
Есть колонки типа x,y,z (float). Нужно выбрать их в три переменных, сравнить и перезаписать по такой схеме:
1) x - самая большая величина
2) y - средняя
3) z - самая меньшая величина

Мой вариант, но какой-то так себе... ни рыба ни мясо имхо.
  
    declare @tbl table (x float,y float, z float,id int)
    insert @tbl (x,y,z,id) values(2,1,1,0)
    declare @old_x float,@old_y float,@old_z float,@length float,@width float,@height float,@id int=0
    ;with q as(select top(3) a,0 as b from @tbl unpivot (a for e in (x,y,z)) as p order by a desc)

    select @old_x = isnull(x,-1),@old_y = isnull(y,-1),@old_z = isnull(z,-1) from @TBL where id=@id
    set @length = case when @old_x >= @old_y and @old_x >= @old_z then @old_x
                       when @old_y >= @old_x and @old_y >= @old_z then @old_y
                       when @old_z >= @old_x and @old_z >= @old_x then @old_z
                  else @old_x
                  end
    set @height = case when @old_x <= @old_y and @old_x <= @old_z then @old_x
                       when @old_y <= @old_x and @old_y <= @old_z then @old_y
                       when @old_z <= @old_x and @old_z <= @old_x then @old_z
                  else @old_z
                  end
    set @width = case when @old_x between @length+1 and @height+1 or @old_x = @height+1 then @old_x
                      when @old_y between @length+1 and @height+1 or @old_y = @height+1 then @old_y
                      when @old_z between @length+1 and @height+1 or @old_z = @height+1 then @old_z
                 else @old_y
                 end
    update @TBL set x=@length,y=@width,z=@height where id = @id
    select * from @tbl

В общем это не работает как надо
Попробовал еще с пивотами, проранжировать... unpivot сработал, а вот pivot так и не смог построить - все время ругается ssms.
Хелп.
14 июл 13, 21:53    [14564160]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка трех переменных и перезапись в таблицу  [new]
invm
Member

Откуда: Москва
Сообщений: 9830
update t
 set
  x = c.new_x,
  y = c.new_y,
  z = c.new_z
from
 table t cross apply
 (
  select
   min(case when rn = 3 then v end) as new_x,
   min(case when rn = 2 then v end) as new_y,
   min(case when rn = 1 then v end) as new_z
  from
   (
    select
     a.v, row_number() over (order by a.v desc) as rn
    from
     (values (t.x), (t.y), (t.z)) a(v)
   ) b
 ) c;
14 июл 13, 23:30    [14564463]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка трех переменных и перезапись в таблицу  [new]
invm
Member

Откуда: Москва
Сообщений: 9830
Наврал. Вот так:
update t
 set
  x = c.new_x,
  y = c.new_y,
  z = c.new_z
from
 table t cross apply
 (
  select
   min(case when rn = 3 then v end) as new_x,
   min(case when rn = 2 then v end) as new_y,
   min(case when rn = 1 then v end) as new_z
  from
   (
    select
     a.v, row_number() over (order by a.v) as rn
    from
     (values (t.x), (t.y), (t.z)) a(v)
   ) b
 ) c;
14 июл 13, 23:31    [14564471]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка трех переменных и перезапись в таблицу  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
пишите 3 case без всяких подзапросов и джойнов
14 июл 13, 23:32    [14564478]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка трех переменных и перезапись в таблицу  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
declare @tbl table (x float,y float, z float,id int)

;with cte as(select * from (values(1),(2),(3))c(n))
insert @tbl (x,y,z,id) 
select c1.n, c2.n, c3.n, ROW_NUMBER()over(order by c1.n, c2.n, c3.n)id 
from cte c1,cte c2,cte c3

select t.id,b.* 
from @tbl t
cross apply (select 
   case when t.x>t.y then t.x else t.y end x,
   case when t.x>t.y then t.y else t.x end y) a
cross apply (select 
   case when t.z>a.x then t.z else a.x end x,
   case when a.x>t.z and t.z>a.y then t.z when a.x>t.z then a.y else a.x end y,
   case when t.z<a.y then t.z else a.y end z
   ) b
15 июл 13, 00:05    [14564558]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка трех переменных и перезапись в таблицу  [new]
_Промешан_
Member

Откуда:
Сообщений: 970
Блин, забыл написать что 2008 сервер.
Но всем спасибо :)
15 июл 13, 13:26    [14567267]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить