Назначить минимальное значение или максимальное значение на основе изменения значения

ИМЕЮТ

ID  cd dt       ct_vl
1   A  20210101 0
1   B  20210201 0 
1   A  20210301 0
2   A  20210101 0
2   B  20210201 1
3   C  20210101 0
3   V  20210201 1
3   C  20210301 0
3   C  20210401 0

ХОТЕТЬ (Получить минимальную дату, когда ct_val в группе идентификаторов равно 0 для этой группы идентификаторов, ИЛИ получить максимальную дату в пределах группы идентификаторов, где ct_val не равен 0 (то есть может содержать 1) для этой группы идентификаторов). Например, если ct_val в группе идентификаторов равно 1, выберите максимальное значение dt, где ct_val в этой группе равно 1.

ID  cd dt       ct_vl final_dt
1   A  20210101 0      20210101
1   B  20210201 0      20210101
1   A  20210301 0      20210101 
2   A  20210101 0      20210201
2   B  20210201 1      20210201
3   C  20210101 0      20210301
3   V  20210201 1      20210301 
3   C  20210301 1      20210301
3   C  20210401 0      20210301
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете попробовать использовать MAX оконную функцию объединения условий с FIRST_VALUE оконной функцией, чтобы получить свою логику.

Запрос 1:

SELECT t.*,
       coalesce(MAX(CASE WHEN ct_vl = 1 THEN dt END) OVER(PARTITION BY ID),FIRST_VALUE(dt) OVER(PARTITION BY ID ORDER BY dt)) final_dt
FROM T t

Полученные результаты:

| ID | CD |       DT | CT_VL | FINAL_DT |
|----|----|----------|-------|----------|
|  1 |  A | 20210101 |     0 | 20210101 |
|  1 |  B | 20210201 |     0 | 20210101 |
|  1 |  A | 20210301 |     0 | 20210101 |
|  2 |  A | 20210101 |     0 | 20210201 |
|  2 |  B | 20210201 |     1 | 20210201 |
|  3 |  C | 20210101 |     0 | 20210301 |
|  3 |  V | 20210201 |     1 | 20210301 |
|  3 |  C | 20210301 |     1 | 20210301 |
|  3 |  C | 20210401 |     0 | 20210301 |

Что не так с min?

David דודו Markovitz 18.03.2022 08:25

Ваше решение работает. В итоге я также включил предложение Дэвида SELECT t.*, coalesce(MAX(CASE WHEN ct_vl = 1 THEN dt END) OVER(PARTITION BY ID) ,min(dt) OVER(PARTITION BY ID)) final_dt FROM T t;

user2008558 18.03.2022 12:49

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