У меня есть данные, такие как таблица A. Я пытаюсь написать код SQL, чтобы изменить значение столбца флага на 1, где значение флага предыдущего месяца (дата столбца) равно 1 для каждого идентификатора.
**Table A**
ID | Date | Flag |
+--------+-----------+------+
| 1 | Jan 20 | 1 |
| 1 | Feb 20 | 0 |
| 1 | Mar 20 | 0 |
| 2 | Jan 20 | 0 |
| 2 | Feb 20 | 1 |
| 2 | Mar 20 | 0 |
+--------+-----------+------+
Мне нужны такие результаты:
ID | Date | Flag |
+--------+-----------+------+
| 1 | Jan 20 | 1 |
| 1 | Feb 20 | 1 |
| 1 | Mar 20 | 0 |
| 2 | Jan 20 | 0 |
| 2 | Feb 20 | 1 |
| 2 | Mar 20 | 1 |
+--------+-----------+------+
Я был бы очень признателен, если бы кто-то мог мне помочь.
В select
вы можете сделать:
select t.*,
(case when flag = 0 and lag(flag) over (partition by id order by date) = 1
then 1
else flag
end) as imputed_flag
from t;
Если вы хотите обновить флаг, вы можете использовать:
with toupdate as (
select t.*,
lag(flag) over (partition by id order by date) as prev_flag
from t
)
update toupdate
set flag = 1
where prev_flag = 1;
@Майк. . . Это был бы другой вопрос, и его следует задать как новый вопрос.
@Майк. . . Есть ли причина, по которой вы не приняли этот ответ? Это ответ на ваш вопрос; это был первый ответ, и он, вероятно, самый. самый эффективный код.
Если вы хотите обновить запись, используйте exists
следующим образом:
Update your_table t
Set t.flag = 1
Where t.flag = 0
And exists
(Select 1 from your_table tt
Where t.id = tt.id
And DATEADD(month, -1, tt.date) = t.date
And tt.flag = 1)
Большое спасибо, ваш ответ очень ясен. что, если я хочу иметь 1 значение imputed_flag, если значение флага равно 1 в течение последних 4 месяцев?