Tambahkan kolom datetime dengan nilai berdasarkan kolom datetime lainnya

Saya punya meja:

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

Menggunakan bahasa SQL (dialek BigQuery) saya perlu menambahkan satu kolom date_today_max, sehingga menyalin semua data dari kolom date, tetapi untuk catatan dengan date terbaru (artinya max(date)) akan mengganti tanggal dengan 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 |

dengan Python+Pandas saya akan mencapai hal serupa

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

tapi saya tidak tahu bagaimana mengatasi ini dengan SQL. Ada fungsi replace, tetapi hanya menerima string sebagai parameter.


person Marcin    schedule 15.11.2020    source sumber
comment
Tolong jelaskan logikanya dalam bahasa Inggris. Kode berguna jika Anda mau, tetapi gagasan manusia paling baik diungkapkan dalam bahasa manusia.   -  person Gordon Linoff    schedule 15.11.2020
comment
@GordonLinoff Saya akan dengan senang hati melakukannya, namun, saya kehilangan seluruh rangkaian kosakata untuk menjelaskan masalah ini dengan tepat, bahkan untuk masalah mendasar seperti ini. Mungkin buku Anda akan membantu saya mengubahnya :). Terima kasih atas bantuan Anda, solusi Anda bekerja dengan sempurna!   -  person Marcin    schedule 16.11.2020


Jawaban (1)


Saya pikir Anda hanya menginginkan ekspresi case dengan fungsi jendela:

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