Добавить столбец даты и времени со значениями, основанными на другом столбце даты и времени

У меня есть таблица:

|       date | x |
|------------+---|
| 2020-09-09 | 1 |
| 2020-09-09 | 2 |
| 2020-10-10 | 3 |
| 2020-10-10 | 4 |
| 2020-10-10 | 5 |
| 2020-11-11 | 6 |
| 2020-11-11 | 7 |

Используя язык SQL (диалект BigQuery), мне нужно добавить один столбец date_today_max, чтобы он копировал все данные из столбца date, но для записей с последним date (что означает max(date)) он заменит дату на current_date:

|       date | date_today_max | x |
|------------+----------------+---|
| 2020-09-09 |     2020-09-09 | 1 |
| 2020-09-09 |     2020-09-09 | 2 |
| 2020-10-10 |     2020-10-10 | 3 |
| 2020-10-10 |     2020-10-10 | 4 |
| 2020-10-10 |     2020-10-10 | 5 |
| 2020-11-11 |     2020-11-15 | 6 |
| 2020-11-11 |     2020-11-15 | 7 |

с Python + Pandas я бы добился подобного с

In [23]: from datetime import datetime

In [24]: import pandas as pd

In [25]: d = pd.date_range("2020-10-10","2020-10-15",freq="1d")

In [26]: df = pd.DataFrame(zip(d,[1,2,3,4,5,6]), columns=['date','x'])

In [27]: df['date_today_max'] = df['date'].replace(df['date'].max(),datetime.now().replace(hour=0,minute=0,second=0,microsecond=0))

In [28]: df
Out[28]:
        date  x date_today_max
0 2020-10-10  1     2020-10-10
1 2020-10-11  2     2020-10-11
2 2020-10-12  3     2020-10-12
3 2020-10-13  4     2020-10-13
4 2020-10-14  5     2020-10-14
5 2020-10-15  6     2020-11-15

но я понятия не имею, как решить эту проблему с помощью SQL. Есть функция replace, но она принимает в качестве параметров только строки.


person Marcin    schedule 15.11.2020    source источник
comment
Пожалуйста, объясните логику на английском языке. Код удобен, если хотите, но человеческие идеи лучше всего выражать на человеческих языках.   -  person Gordon Linoff    schedule 15.11.2020
comment
@GordonLinoff Я бы с радостью сделал это, однако мне не хватает целого набора словарного запаса, чтобы правильно описать эти проблемы, даже для такой простой проблемы, как эта. Может быть, ваша книга поможет мне изменить это :). Спасибо за помощь, ваше решение сработало отлично!   -  person Marcin    schedule 16.11.2020


Ответы (1)


Я думаю, вам просто нужно выражение case с оконной функцией:

select date, x,
       (case when date = max(date) over ()
             then current_date else date
        end) as date_today_max
from t;
person Gordon Linoff    schedule 15.11.2020