ИМЕЮТ
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
Вы можете попробовать использовать 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 |
Ваше решение работает. В итоге я также включил предложение Дэвида 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;
Что не так с
min
?