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

Откуда:
Сообщений: 63
День добрый. Не могу найти решения при помощи инструментов запроса для получения следующего результата:

123
17070
26770
36970
47474
57274
67374
77676
87276
97176
107576
11-7675
12-7574


Где колонка №1 - номер строки, №2 - последовательность значений с корректировками. Цель - рассчитать колонку №3 - последний максимум колонки №2 предыдущих значений для текущей строки с учетом корректировок со знаком "-" ,т.е. строки №11 и №12 отменяют строки №7 и №10 соотв-но и максимум должен измениться.

Рекурсией и ранжированием не получается, искать для каждой строки максимум с самого начала таблицы долго и некрасиво, курсором обходить тоже не хотелось бы. Заранее благодарю за советы.
23 янв 15, 14:01    [17159673]     Ответить | Цитировать Сообщить модератору
 Re: Поможите с запросом )  [new]
Добрый Э - Эх
Guest
с результатом понятно. а исъходные-то данные как из себя выглядят?
23 янв 15, 14:05    [17159711]     Ответить | Цитировать Сообщить модератору
 Re: Поможите с запросом )  [new]
Добрый Э - Эх
Guest
Qseftt,

скорее всего - магия данных, но , думаю, общее направление мысли будет понятно:
--
-- Тестовые данные:
with 
  t(id, num) as 
    (
      select *
        from (
               values (1,70),
                      (2,67),
                      (3,69),
                      (4,74),
                      (5,72),
                      (6,73),
                      (7,76),
                      (8,72),
                      (9,71),
                      (10,75),
                      (11,-76),
                      (12,-75)
             ) v (id, num)
    )
--
-- Основной запрос:
select t0.id, t0.num, MAX(v.num)
  from t t0
  cross apply 
         (
           select num 
             from t t1
            where t1.id <= t0.id 
            except
            select -num 
             from t t2
            where t2.id <= t0.id 
            and t2.num < 0
         )v
group by t0.id, t0.num
order by 1
23 янв 15, 15:01    [17160314]     Ответить | Цитировать Сообщить модератору
 Re: Поможите с запросом )  [new]
Qseftt
Member

Откуда:
Сообщений: 63
Спасибо, исходные данные - таблица без колонки №3.
23 янв 15, 15:03    [17160342]     Ответить | Цитировать Сообщить модератору
 Re: Поможите с запросом )  [new]
Qseftt
Member

Откуда:
Сообщений: 63
Добрый Э - Эх , спасибо, но не производительно, записей около млн..

Более подробно опишу задачу: для каждой строки таблицы заявок рассчитать максимально значение колонки из Val с учетом записей отменяющих заявку - запись Val с минусом. Где: № - номер транзакции,Id - номер заявки,Val - объем заявки, maxVal - максимальное значение Val предыдущих заявок до текущей строки . Т.е. необходимо рассчитать колонку maxVal.

Я вот не помню, есть ли какой инструмент для обращения к уже полученному результирующему набору строк с текущей строки? Так быстрее было бы получить актуальный максимум после отмены заявки, у которой было максимальное значение.


IdValmaxVal
11227070
21236770
31246970
41257474
51267274
61277374
71287676
81297276
91307176
101317576
11128-7675
12131-7574
131327274
141337676
23 янв 15, 16:44    [17161064]     Ответить | Цитировать Сообщить модератору
 Re: Поможите с запросом )  [new]
ModelR
Member

Откуда: Нижний Новгород
Сообщений: 1798
А количество вхождений нужно считать?

with t(id, num) as (
    select id, num
    from (
            values (1,70),
                    (2,67),
                    (3,69),
                    (4,74),
                    (5,72),
                    (6,73),
                    (7,76),
                    (8,72),
                    (9,71),
                    (10,75),
                    (11,-76),
                    (12,-75),
			(13,72),
			(14,76)

            ) v (id, num)
), counts as (
        select id, num, tc.maxnum, tc.cnt
	from t t1
	cross apply (
		select abs(t2.num) maxnum, sum(sign(num)) cnt 
		from  t t2 
		where t2.id <= t1.id
		group by abs(t2.num)
		having sum(sign(num)) > 0
	) tc
)
select id, num, max(maxnum) maxn
from counts
group by id, num
23 янв 15, 17:30    [17161445]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить