Если значение столбца равно 1, то получите такое же значение для следующей даты

У меня есть данные, такие как таблица 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    |
+--------+-----------+------+

Я был бы очень признателен, если бы кто-то мог мне помочь.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
87
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В 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;

Большое спасибо, ваш ответ очень ясен. что, если я хочу иметь 1 значение imputed_flag, если значение флага равно 1 в течение последних 4 месяцев?

Mike 14.12.2020 03:20

@Майк. . . Это был бы другой вопрос, и его следует задать как новый вопрос.

Gordon Linoff 14.12.2020 03:22

@Майк. . . Есть ли причина, по которой вы не приняли этот ответ? Это ответ на ваш вопрос; это был первый ответ, и он, вероятно, самый. самый эффективный код.

Gordon Linoff 19.12.2020 03:06

Если вы хотите обновить запись, используйте 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)

Другие вопросы по теме