#sql #sql-server #datetime #sql-update
#sql #sql-сервер #дата и время #sql-обновление
Вопрос:
Я написал запрос, который выдает результат, как показано ниже:
Date Amount
01-01-2020
01-02-2020 10000
01-03-2020 20000
01-04-2020 30000
01-05-2020 40000
01-06-2020
01-07-2020
01-08-2020
В приведенной выше таблице мы видим, что сумма равна нулю для 01-01-2020, 01-06-2020, 01-07-2020, 01-08-2020. Теперь я хочу добавить 0 в столбец суммы только для 1 строки, т.е. для даты — 01-06-2020, которая находится после последней точки данных — 40000. И я не уверен, как это сделать. Есть ли какой-либо прямой запрос для достижения этой цели? Спасибо.
Комментарии:
1. Гарантируется ли, что все заполненные значения являются смежными? Если нет, обрабатывается ли каждая группа отдельно или это только самое последнее значение, которое вызывает ноль?
2. Значение 0 никоим образом не связано с приведенными выше числами. Я должен создать диаграмму с помощью этого вывода в другом приложении, и у меня должен быть один 0 после последней точки данных. (в нашем случае 0 после 40000)
3. Что, если у 01-07-2020 тоже были данные? Какие строки, если таковые имеются, вы хотели бы изменить?
Ответ №1:
Вы можете использовать lag()
и case
выражение:
select date,
case when amount is null and lag(amount) over(order by date) is not null
then 0
else amount
end as amount
from mytable
Если вам нужен update
оператор:
with cte as (
select amount,
case when amount is null and lag(amount) over(order by date) is not null
then 0
end as new_amount
from mytable
)
update cte set amount = new_amount where new_amount = 0
Комментарии:
1. Я получаю сообщение «Оконные функции могут отображаться только в предложениях SELECT или ORDER BY», когда я использую приведенный выше код в инструкции update.
2. @BrawlX: Я обновил свой ответ
update
заявлением.3. @BrawlX, пожалуйста, отметьте это как ответ. таким образом, это будет полезно для других в будущем