Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Непростой запрос  [new]
estееееее
Guest
Как одним запросом для набора строк вычислить значение по формуле, причем результат вычисленный по формуле для каждoй строки подставляется в вычисления для следующей строки. Строки отсортированы по дате и порядок имеет значение. Количество строк может быть большим ~100.


Абстрактный пример

DECLARE @t TABLE(s VARCHaR(10), d DATETIME, val INT)

INSERT INTO @t
SELECT 'A', '2009-01-01', 1
UNION ALL
SELECT 'B', '2009-01-02', 7
UNION ALL
SELECT 'C', '2009-01-03', 8



SELECT CASE WHEN val%5 = 3 AND val_prev%5 = 3 THEN val + (val_prev) ELSE val_prev + val * 2 END
FROM @t

val_prev - результат вычисления для предыдущей строки.

Для всей таблицы должно получиться одно значение
2 ноя 09, 12:24    [7870161]     Ответить | Цитировать Сообщить модератору
 Re: Непростой запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
А что в вашей таблице задает порядок вычислений ?
2 ноя 09, 12:26    [7870175]     Ответить | Цитировать Сообщить модератору
 Re: Непростой запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
estееееее,

  • рекурсивное CTE
  • цикл по курсору
  • 2 ноя 09, 12:27    [7870188]     Ответить | Цитировать Сообщить модератору
     Re: Непростой запрос  [new]
    esteeeeee
    Guest
    порядок перебора строк - по дате. Надо одним запросом без курсоров и вычислений.
    Вычисления начинаются со второй строи, и как предыдущее значение подставляется значение из первой строки.

    DECLARE @t TABLE(s VARCHaR(10), d DATETIME, val INT)

    INSERT INTO @t
    SELECT 'A', '2009-01-01', 8
    UNION ALL
    SELECT 'B', '2009-01-02', 13
    UNION ALL
    SELECT 'C', '2009-01-03', 5
    UNION ALL
    SELECT 'D', '2009-01-04', 1


    SELECT CASE WHEN val%5 = 3 AND val_prev%5 = 3 THEN val + (val_prev) ELSE val_prev + val * 2 END
    FROM @t

    Для таких данных должно получиться 211
    2 ноя 09, 12:31    [7870234]     Ответить | Цитировать Сообщить модератору
     Re: Непростой запрос  [new]
    esteeeeee
    Guest
    я хотел сказать без курсоров и СТЕ. Только select
    2 ноя 09, 12:32    [7870241]     Ответить | Цитировать Сообщить модератору
     Re: Непростой запрос  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104760
    esteeeeee
    порядок перебора строк - по дате.

    Т.е. не может быть двух одинаковых дат ?
    2 ноя 09, 12:32    [7870242]     Ответить | Цитировать Сообщить модератору
     Re: Непростой запрос  [new]
    esteeeeee
    Guest
    Да, дат одинаковых быть не может
    2 ноя 09, 12:33    [7870250]     Ответить | Цитировать Сообщить модератору
     Re: Непростой запрос  [new]
    aleks2
    Guest
    Update
    недокументированно, но работать будет.
    2 ноя 09, 12:40    [7870327]     Ответить | Цитировать Сообщить модератору
     Re: Непростой запрос  [new]
    esteeeeee
    Guest
    aleks2
    Update
    недокументированно, но работать будет.


    Нужно только через select
    2 ноя 09, 12:44    [7870373]     Ответить | Цитировать Сообщить модератору
     Re: Непростой запрос  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 46975
    aleks2
    Update
    недокументированно, но работать будет.
    Опять же,
    estееееее
    Строки отсортированы по дате и порядок имеет значение
    Так что, когда будет работать, а когда и нет...
    Непредсказуемо.
    2 ноя 09, 12:45    [7870384]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить