Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вычислить значение поля по модулю другого  (Прочитано 15420 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Arinyshka
Белый клоун, бедный мученик...
Постоялец

by
Offline Offline
Пол: Женский

« : 30-06-2008 12:25 » 

Суть задачки в следующем: в таблице есть поля
Код:
CREATE TABLE [dbo].[StorH_Price] (
  [id_storh_price] int IDENTITY(1, 1) NOT NULL,

  [id_group] int NULL,


  [Name_price] nvarchar(50) ,
 
  [Order_price] int NULL,
  [order_ingroup] int NULL,

у меня есть чужой модуль и хранимая, которые переупорядочивают записи в таблице по вводимому пользователем порядку для поля   
Код:
Order_price
, это сквозная нумерация по таблице. При этом поле
Код:
  order_ingroup 
не меняется - а жаль Улыбаюсь Мне нужно его изменять... Причем следующим образом: например, по сквозной нумерации запись получилась 10-ой. Она относится к 3-ей группе (поле
Код:
 d_group 
). К  группе с id_group = 1 относились 3 записи, во второй 6... значит, моя запись должна получить стать 1-ой в своей группе... то есть поле
Код:
 order_ingroup 
вычисляется в зависимости от количества полей, вошедших в предыдущие группы... Это вообще реально в рамках хранимой?
« Последнее редактирование: 30-06-2008 12:30 от Arinyshka » Записан

Непонятная свобода обручем сдавила грудь...
Arinyshka
Белый клоун, бедный мученик...
Постоялец

by
Offline Offline
Пол: Женский

« Ответ #1 : 30-06-2008 15:01 » 

выкрутилась... ну советы бы послушала Улыбаюсь
Записан

Непонятная свобода обручем сдавила грудь...
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #2 : 01-07-2008 04:14 » 

для MS SQL 2005

Код:
select
  id_storh_price,
  id_group,
  Name_price,
  Order_price,
  row_number() over (partition by id_group order by Order_price) as order_ingroup
from
  StorH_Price

т.е поле order_ingroup - вычисляется и можно из таблицы удалить
Записан

I Have Nine Lives You Have One Only
THINK!
Arinyshka
Белый клоун, бедный мученик...
Постоялец

by
Offline Offline
Пол: Женский

« Ответ #3 : 01-07-2008 07:29 » 

Не понимаю Жаль
как это работает:
Код:
row_number() over (partition by id_group order by Order_price) as order_ingroup
Записан

Непонятная свобода обручем сдавила грудь...
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 01-07-2008 10:09 » 

Arinyshka, функция row_number() возвращает номер строки. Чтобы строки имели определённые номера, их нужно упорядочить, что делается аргументом order by Order_price - этот аргумент обязателен для row_number(). Номер строки можно получать для всей таблицы или внутри группы. Второе задаётся аргументом partition by id_group - этот аргумент необязателен для row_number(), но нужен для твоей задачи. Результаты помещаются в колонку, названную order_ingroup.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Arinyshka
Белый клоун, бедный мученик...
Постоялец

by
Offline Offline
Пол: Женский

« Ответ #5 : 01-07-2008 12:35 » 

ой, спасибо... я выкручивалась куда грубее:
Код:
select @id_group = id_group
from storh_price
where  id_storh_price = @id_storh_price

select @order_ingroup =(
 select count (order_ingroup)
 from storh_price
 where id_group < @id_group)
 
 set @id_inGroup =@order_price-@order_ingroup

даже стыдно теперь  Скромно так...
Записан

Непонятная свобода обручем сдавила грудь...
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #6 : 02-07-2008 04:18 » 

Цитата
даже стыдно теперь 


почему, ф-ция row_number() появилась только в 2005 сервере
до этого примерно так и выкручивались

примерно так
Код:
select
  sp1.id_storh_price,
  sp1.id_group,
  sp1.Name_price,
  sp1.Order_price,
  count(sp2.Order_price) as order_ingroup
from
  StorH_Price sp1
left join  StorH_Price sp2 on sp2.id_group = sp1.id_group and sp2.order_price <= sp1.order_price
group by
  sp1.id_storh_price,
  sp1.id_group,
  sp1.Name_price,
  sp1.Order_price
Записан

I Have Nine Lives You Have One Only
THINK!
Arinyshka
Белый клоун, бедный мученик...
Постоялец

by
Offline Offline
Пол: Женский

« Ответ #7 : 02-07-2008 11:16 » 

хммм... как select конструкция работает замечательно, а вот в update я ее впихнуть не могу... А ведь мне нужно не просто посчитать поле, но и впихнуть новое, посчитанное значение.. Чего я не понимаю?
Записан

Непонятная свобода обручем сдавила грудь...
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 02-07-2008 12:31 » 

Цитата: Arinyshka
Чего я не понимаю?
Того, что номер строки не хранится в БД. Он вычисляется каждый раз при запросе в соответствии с порядком сгруппированных и отсортированных записей.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Arinyshka
Белый клоун, бедный мученик...
Постоялец

by
Offline Offline
Пол: Женский

« Ответ #9 : 02-07-2008 12:49 » 

аха. Значит, это не то, что мне нужно Жаль
Записан

Непонятная свобода обручем сдавила грудь...
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 02-07-2008 18:41 » 

Arinyshka, почему? Достаточно сделать view и считать его таблицей с пронумерованными записями. Или нужны каскадные обновления номеров в других таблицах?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #11 : 03-07-2008 04:33 » 

хммм... как select конструкция работает замечательно, а вот в update я ее впихнуть не могу... А ведь мне нужно не просто посчитать поле, но и впихнуть новое, посчитанное значение.. Чего я не понимаю?
вот пример для update (только таблицу упростил)

Код:
--создаем таблицу
create table #t(group_id int, order_in_table int, order_in_group int)

insert into #t(group_id, order_in_table)
select 1, 1 union all
select 1, 2 union all
select 1, 3 union all
select 1, 4 union all
select 1, 5 union all
select 1, 6 union all
select 2, 7 union all
select 2, 8 union all
select 2, 9 union all
select 3, 10

--простая выборка с номером строки
select
  group_id,
  order_in_table,
  row_number() over (partition by group_id order by order_in_table)
from
  #t

--использования для обновления поля
update #t
  set order_in_group = t.rn
from (
  select
    group_id,
    order_in_table,
    row_number() over (partition by group_id order by order_in_table) rn
  from
    #t) t
where
  #t.group_id = t.group_id
  and #t.order_in_table = t.order_in_table

select * from #t
drop table #t
Записан

I Have Nine Lives You Have One Only
THINK!
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 03-07-2008 06:09 » 

HandKot, всё это так, но черевато. Номер строки - ненадёжная вещь, которая может разом измениться у нескольких записей при добавлении новой записи в начало или середину упорядоченного набора. Я бы вообще порядковые номера записей в базе не хранил. Хранил бы только в том случае, если точно известно, что новые записи всегда добавляются в конец (например, в системе документооборота, где документам выдают регистрационные номера).
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #13 : 03-07-2008 10:15 » 

ну дык так просили
я тоже не понимаю зачем
но, как говорится,:"если девушка хочет ..." Улыбаюсь
Записан

I Have Nine Lives You Have One Only
THINK!
Arinyshka
Белый клоун, бедный мученик...
Постоялец

by
Offline Offline
Пол: Женский

« Ответ #14 : 07-07-2008 06:53 » 

ну дык так просили
я тоже не понимаю зачем
но, как говорится,:"если девушка хочет ..." Улыбаюсь
Чесслово, идея не моя Улыбаюсь Просто юзер из-под оболочки должен иметь возможность "перетаскивать", то есть переупорядочивать записи. И в разных модулях они, соответственно, должны быть показаны либо в удобном ему порядке в группе, либо все подряд по сквозной нумерации. Вот над связкой полей для сквозной нумерации и порядковой в группе я и думаю Улыбаюсь
Записан

Непонятная свобода обручем сдавила грудь...
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 07-07-2008 10:11 » 

Пронумеровать группы и строки в группах. Но неудобно это при обновлении данных Жаль.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines