Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2012, 10:05   #1
KOHCEPBATOP
Пользователь
 
Регистрация: 13.04.2010
Сообщений: 17
По умолчанию Добавить значение из следующей записи

Есть справочная таблица из полей: kod, sect_num, value, где
kod - код блока,
sect_num - номер строки в блоке (значения строго увеличиваются на неопределенное целое значение, максимальное значение меньше 999999),
value - значение из справочника.

Нужно для заданного блока для номера строки sn получить пару
(sect_num1, value1 ; sect_num2, value2), где sect_num1 <= sn и sect_num2 > sn

Я реализовал через временную:
Код:
with skp_num as (
   select 
         row_num=row_number() over(partition by kod order by sect_num), *  
   from skp 
)   
select 
   skp1.kod, value1=skp2.value, value2=skp2.value, sect_from=skp1.sect_num, sect_to=case when skp2.kod is null then 999999 else skp2.sect_num end
from skp_num skp1
left join skp_num skp2 on skp2.kod=skp1.kod and skp2.row_num=skp1.row_num+1
Можно ли сделать тоже самое:
1. без временной таблицы,
2. более эффективно.
KOHCEPBATOP вне форума Ответить с цитированием
Старый 29.11.2012, 11:23   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

для MS SQL
Код:
select kod, skp1.num, skp1.val, skp2.num, skp2.val
from ( select num as num1, ( select top 1 num from skp where kod=kod and num>num order by num) as num2 from skp ) skp00
left join skp skp1 on skp00.num1 =skp1.num
left join skp skp2 on skp00.num2 =skp2.num
по сути таже временная таблица но внутри from (select ...)

если нужна только одна запись можно прообовать нечто такое
Код:
select kk, skp1.num, skp1.val, skp2.num, skp2.val
from skp akp1 where skp1.num = (select max(num) from skp where num<=sn and kod=kk ) --самый большой из меньших
left join skp skp2 on skp2.num = (select min(num) from skp where num>=sn and kod=kk ) --самы маленький из больших
код не проверял!
и нужна более аккуратная обоаботка границ
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 29.11.2012, 15:49   #3
KOHCEPBATOP
Пользователь
 
Регистрация: 13.04.2010
Сообщений: 17
По умолчанию

evg_m, спасибо
KOHCEPBATOP вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти значение на другом листе и подставить значение следующей ячейки ElenaNTro Microsoft Office Excel 12 11.02.2019 12:44
добавить слово и его значение в массив LezhiK Помощь студентам 0 10.05.2011 17:44
добавить значение в начало списка combobox1 codermoder Компоненты Delphi 3 11.12.2010 01:36
Задача: Найти среднеарифметическое значение следующей функции: АндрейТап Помощь студентам 1 07.11.2010 14:20
Добавить значение в зависимости от цвета ячейки fraise Microsoft Office Excel 11 19.02.2010 21:37