Как я могу зациклить, чтобы получить предыдущее значение, когда текущее значение больше предыдущего?

Источник:

Seq Amount
1   50
2   48
3   46
4   40
5   45
6   43
7   39

Вот что я хочу,
когда сумма в текущей строке больше последней, она меняется на предыдущую.
Например, в строке 5 сумма 45>40 в строке 4, затем измените ее до 40
в строке 6, количество 43>40 в обновленной строке 5, затем измените его на 40

Это ожидаемый результат:

Seq Amount
1   50
2   48
3   46
4   40
5   40
6   40
7   39

В настоящее время я использую отставание (количество) вместо (порядок по последовательности)
, однако результат неверен. Я думаю, мне нужен сценарий цикла, но я не уверен, как это сделать, пожалуйста, помогите.
Спасибо!


person B_BKIN    schedule 07.01.2016    source источник
comment
Seq 6 должно быть 43, не так ли?   -  person D'Arcy Rittich    schedule 07.01.2016
comment
Seq 6 должно быть 40, так как исходное количество равно 43, что больше, чем обновленное количество Seq 5 (40).   -  person B_BKIN    schedule 07.01.2016


Ответы (2)


Вот более общая версия, не требующая LAG:

скрипт SQL

Настройка схемы MS SQL Server 2008:

CREATE TABLE Table1
    ([Seq] int, [Amount] int)
;

INSERT INTO Table1
    ([Seq], [Amount])
VALUES
    (1, 50),
    (2, 48),
    (3, 46),
    (4, 40),
    (5, 45),
    (6, 43),
    (7, 39)
;

Запрос 1:

select t1.Seq, case when t1.Amount < t2.Amount or t2.Amount is null then t1.Amount else t2.Amount end as Value
from Table1 t1
left join Table1 t2 on t2.Seq = t1.Seq - 1
order by t1.Seq

Результаты:

| Seq | Value |
|-----|-------|
|   1 |    50 |
|   2 |    48 |
|   3 |    46 |
|   4 |    40 |
|   5 |    40 |
|   6 |    43 |
|   7 |    39 |
person D'Arcy Rittich    schedule 07.01.2016
comment
Спасибо за помощь! Но теперь сумма в строке 6 › сумма в строке 5, строка 6 должна измениться на 40 вместо 43. Я думаю, что нельзя просто использовать простую функцию соединения. есть ли другое решение? - person B_BKIN; 07.01.2016
comment
Ага, понятно. Я бы рассмотрел решения с использованием CTE или, возможно, PARTITION. - person D'Arcy Rittich; 07.01.2016

Обновите столбец, используя логику, предоставленную RedFilter, в цикле while, пока значение @@rowcount = 0

person Ali Sayed    schedule 20.01.2016