添加具有基于另一个日期时间列的值的日期时间列

Posted

技术标签:

【中文标题】添加具有基于另一个日期时间列的值的日期时间列【英文标题】:Add datetime column with values based on another datetime column 【发布时间】:2020-11-15 16:52:44 【问题描述】:

我有一张桌子:

|       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 函数,但它只接受字符串作为参数。

【问题讨论】:

请用英文解释逻辑。如果您愿意,代码很方便,但人类的想法最好用人类语言表达。 @GordonLinoff 我很乐意这样做,但是,即使对于像这样的基本问题,我也缺少一整套正确描述这些问题的词汇。也许你的书会帮助我改变这一点:)。感谢您的帮助,您的解决方案完美运行! 【参考方案1】:

我认为您只需要一个带有窗口函数的 case 表达式:

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

【讨论】:

以上是关于添加具有基于另一个日期时间列的值的日期时间列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用基于日期列的预测

使用 JavaScript,如何在具有多个值的日期列的表中突出显示“今天”的每个日期

如何将天数(作为列的值)添加到日期?

根据另一列的值修改熊猫中的日期时间列

PHP - 从具有空值的日期列中插入日期时遇到问题。值在数组内

添加具有基于从文件名中提取的日期的值的列(值的长度 (1) 与索引的长度 (50) 不匹配)