Arinyshka
Белый клоун, бедный мученик...
Постоялец
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, у меня есть чужой модуль и хранимая, которые переупорядочивают записи в таблице по вводимому пользователем порядку для поля , это сквозная нумерация по таблице. При этом поле не меняется - а жаль Мне нужно его изменять... Причем следующим образом: например, по сквозной нумерации запись получилась 10-ой. Она относится к 3-ей группе (поле ). К группе с id_group = 1 относились 3 записи, во второй 6... значит, моя запись должна получить стать 1-ой в своей группе... то есть поле вычисляется в зависимости от количества полей, вошедших в предыдущие группы... Это вообще реально в рамках хранимой?
|
|
« Последнее редактирование: 30-06-2008 12:30 от Arinyshka »
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
|
« Ответ #1 : 30-06-2008 15:01 » |
|
выкрутилась... ну советы бы послушала
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
HandKot
Молодой специалист
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
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
|
« Ответ #3 : 01-07-2008 07:29 » |
|
Не понимаю как это работает: row_number() over (partition by id_group order by Order_price) as order_ingroup
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Dimka
Деятель
Команда клуба
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
Белый клоун, бедный мученик...
Постоялец
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
Молодой специалист
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
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
|
« Ответ #7 : 02-07-2008 11:16 » |
|
хммм... как select конструкция работает замечательно, а вот в update я ее впихнуть не могу... А ведь мне нужно не просто посчитать поле, но и впихнуть новое, посчитанное значение.. Чего я не понимаю?
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #8 : 02-07-2008 12:31 » |
|
Чего я не понимаю? Того, что номер строки не хранится в БД. Он вычисляется каждый раз при запросе в соответствии с порядком сгруппированных и отсортированных записей.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
|
« Ответ #9 : 02-07-2008 12:49 » |
|
аха. Значит, это не то, что мне нужно
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #10 : 02-07-2008 18:41 » |
|
Arinyshka, почему? Достаточно сделать view и считать его таблицей с пронумерованными записями. Или нужны каскадные обновления номеров в других таблицах?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
HandKot
Молодой специалист
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
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #12 : 03-07-2008 06:09 » |
|
HandKot, всё это так, но черевато. Номер строки - ненадёжная вещь, которая может разом измениться у нескольких записей при добавлении новой записи в начало или середину упорядоченного набора. Я бы вообще порядковые номера записей в базе не хранил. Хранил бы только в том случае, если точно известно, что новые записи всегда добавляются в конец (например, в системе документооборота, где документам выдают регистрационные номера).
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #13 : 03-07-2008 10:15 » |
|
ну дык так просили я тоже не понимаю зачем но, как говорится,:"если девушка хочет ..."
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
|
« Ответ #14 : 07-07-2008 06:53 » |
|
ну дык так просили я тоже не понимаю зачем но, как говорится,:"если девушка хочет ..." Чесслово, идея не моя Просто юзер из-под оболочки должен иметь возможность "перетаскивать", то есть переупорядочивать записи. И в разных модулях они, соответственно, должны быть показаны либо в удобном ему порядке в группе, либо все подряд по сквозной нумерации. Вот над связкой полей для сквозной нумерации и порядковой в группе я и думаю
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #15 : 07-07-2008 10:11 » |
|
Пронумеровать группы и строки в группах. Но неудобно это при обновлении данных .
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
|