三分钟,趁同事上厕所的时间,我覆盖了公司的正式环境数据

本文介绍如何在正式环境中批量修改数据报表,并强调操作前备份的重要性。同时,讲解了跨库查询及使用CASE语句处理数据的方法。

大家好啊,又跟大家见面了,最近有个需求就是批量修改公司的数据报表,正式环境!!
而且要执行update!!

update it_xtgnyhcebg I set taskStatus = XXX

而且是没有加where条件的,相当于全表更新,这可马虎不得,我们在任何操作正式数据库之前一定一定要对数据库备份!!不要问我怎么知道的,因为我就因为有一次把测试环境的数据覆盖到正式环境去了,然后被公司扣钱了。。。
在这里插入图片描述
别到时候就后悔莫急,那是没有用的!
在这里插入图片描述
在这里插入图片描述
由于这个需求是需要在跨库操作的,所以我们在查询数据的时候需要带上库的名称,例如这样

SELECT
	* 
FROM
	BPM00001.ACT_HI_PROCINST P 
	LEFT JOIN BPM00001.ACT_HI_VARINST V ON V.PROC_INST_ID_ = P.ID_ 
	AND V.NAME_ = '__RESULE'

这样如果我们在任何一个库里面,只要在一个mysql服务里面都可以访问到这个数据
查出这个表之后
在这里插入图片描述
我们需要根据这里的内容显示出不同的东西
就例如说是“APPROVAL”我就显示“已通过”
这就类似与java中的Switch,其实sql也能实现这样的效果
如下:
在这里插入图片描述
这就是sql的case语句的使用
有了这些数据之后我们就可以更新数据表了,回到我们之前讨论过的,这是及其危险的操作
我们先把要set的值给拿出来
在这里插入图片描述

在这里插入图片描述
但是我们怎么知道这个里面的主键呢?
你如果直接这么加,肯定是不行的
在这里插入图片描述
所以我们需要在sql后面加入这样的一条语句
在这里插入图片描述
注意,这个语句一定要写在set语句的里面,这样sql就能依据里面判断的条件进行一一赋值
最后,将这个sql语句执行到生产库中

拓展:

作为查询语句的key绝对不能重复,否则会失败(找bug找了半天的人的善意提醒)
例如上面的语句中P.BUSINESS_KEY_必须要保证是唯一的!!

在这里插入图片描述
成功执行!!!
怎么样,这些sql的小妙招你学会了吗?

<think>我们有一个时间序列数据,需要按分钟聚合,但要求是计算相邻三分钟数据值的总和。注意,这里的聚合是每三分钟作为一个窗口,计算该窗口内所有值的总和。 例如,假设我们有分钟数据:00:00, 00:01, 00:02, ... 那么第一个窗口可能是00:00-00:02(3分钟),下一个窗口是00:03-00:05,以此类推。 在pandas中,我们可以使用`resample`函数来实现。但是,注意`resample`默认的聚合窗口是从每个时间点开始的固定频率窗口。例如,如果我们指定'3T'(3分钟),那么默认的窗口起始点是整点(如00:00, 00:03等)开始,然后聚合每个3分钟内的数据。 但是,用户要求的是“相邻三分钟”,也就是连续的三分钟窗口,且每个窗口之间没有重叠(除非指定了滑动窗口,但这里没有要求滑动,而是每三分钟一个窗口)。所以,我们可以使用`resample('3T')`来实现。 然而,需要注意的是,`resample`默认的窗口是左闭右闭还是左闭右开?这取决于我们设置的参数。在pandas中,时间序列的聚合窗口规则可以通过`closed`和`label`参数进行调整。 根据引用[2]和引用[3]: - `closed`:用于指定间隔的哪一端是闭合的(即包含边界)。默认情况下,对于下采样(即把高频数据转为低频),`closed`的默认值取决于频率。对于分钟级数据(如'3T'),默认是左闭右开?但实际我们需要根据情况调整。 - `label`:用于指定聚合结果的标签是使用窗口的左边界还是右边界。例如,如果我们设置`label='right'`,那么聚合结果的索引标签将是窗口的右边界(即结束时间)。 但是,用户要求的是“相邻三分钟”,并且没有特别说明窗口的闭合方式。通常,我们可能希望每个窗口包含连续的三分钟,比如第一个窗口包含00:00, 00:01, 00:02,那么结束时间是00:02。但是,`resample('3T')`默认的窗口对齐方式是从起始时间开始每3分钟。例如,如果我们的数据从00:00开始,那么第一个窗口是00:00到00:03(但不包括00:03?),这取决于`closed`参数。 根据pandas文档,`resample`的默认行为是左闭右开(即包含左边界,不包含右边界)?但实际情况可能因版本而异。为了明确控制,我们可以设置`closed`参数。 由于我们要计算相邻三分钟,且每个窗口应该是连续的,没有重叠。我们可以这样设置: - 使用`resample('3T')`,然后设置`closed='right'`?或者`closed='left'`?这取决于我们如何定义窗口。 但是,用户要求的是“精确到分钟,求相邻三分钟数据值的总和”。这里我们假设数据是分钟级别的,且每个时间点代表那一分钟的数据。 例如,数据可能是: 2023-01-01 00:00:00 -> 1 2023-01-01 00:01:00 -> 2 2023-01-01 00:02:00 -> 3 2023-01-01 00:03:00 -> 4 2023-01-01 00:04:00 -> 5 2023-01-01 00:05:00 -> 6 我们希望得到: 第一个窗口(00:00-00:02): 1+2+3=6 第二个窗口(00:03-00:05): 4+5+6=15 注意:在pandas中,如果我们使用`resample('3T')`,默认的窗口划分是: 第一个窗口:00:00:00 - 00:03:00(但不包括00:03:00),所以会包含00:00,00:01,00:02 第二个窗口:00:03:00 - 00:06:00,包含00:03,00:04,00:05 所以,默认的`closed`参数对于分钟数据是左闭右开?因此,我们不需要特别设置`closed`,因为默认情况下,00:00到00:03这个窗口包含00:00,00:01,00:02(因为不包含00:03,所以00:03在下一个窗口)。 但是,我们也可以显式设置`closed='left'`,这样每个窗口包含左边界,不包含右边界。这样,第一个窗口就是[00:00, 00:03),即包含00:00,00:01,00:02。 另外,我们可能还需要设置`label`。如果我们希望聚合结果的索引标签是窗口的结束时间(即00:02和00:05),那么设置`label='right'`。但通常,我们可能希望标签是窗口的起始时间,或者结束时间。根据用户需求,这里没有明确,我们可以选择结束时间,因为这样更直观(表示到哪个时间点为止的三分钟)。 不过,用户要求的是“精确到分钟”,所以标签用分钟表示即可。 因此,步骤: 1. 确保时间列是datetime类型,并设置为索引。 2. 使用`resample('3T')`进行重采样,然后使用`sum()`聚合。 3. 设置`label='right'`,这样标签就是窗口的结束时间(即每个三分钟窗口的最后一分钟)。 但是,注意:如果我们的数据时间戳不是从整点开始,比如从00:01开始,那么默认的窗口划分可能会不同。为了确保窗口从整点开始,我们可以使用`origin`参数来调整,但这里用户没有要求,我们假设数据从整点开始。 另外,如果数据不是连续的,可能会包含NaN值,我们需要考虑如何处理。用户没有说明,我们可以默认跳过NaN(即sum时忽略NaN,但pandas的sum默认会跳过NaN,不过如果整个窗口都是NaN,结果会是0,但我们可以通过`min_periods`参数要求至少有多少个非NaN值,否则结果为NaN。但这里用户没有要求,我们可以先不做处理。 示例代码: 假设我们有一个DataFrame `df`,其中有一列是时间(列名为'timestamp'),另一列是数值(列名为'value')。 步骤: 1. 将'timestamp'列转换为datetime类型,并设置为索引。 2. 按3分钟频率重采样,使用`sum`聚合,并设置`label='right'`(这样标签就是窗口的结束时间)。 代码如下: ```python import pandas as pd # 假设df是已有的DataFrame,包含'timestamp'和'value'列 # 将timestamp转换为datetime df['timestamp'] = pd.to_datetime(df['timestamp']) df.set_index('timestamp', inplace=True) # 按3分钟重采样,计算总和,并设置标签为窗口的结束时间 result = df.resample('3T', label='right').sum() # 重置索引(如果需要把时间变成列) # result.reset_index(inplace=True) ``` 注意:如果数据时间戳不是按分钟连续的,那么`resample`会自动创建连续的时间窗口,并将窗口内没有数据的地方用0填充(对于sum,没有数据的地方会得到0)。如果希望没有数据的窗口为NaN,可以设置`min_periods`参数,例如`min_periods=1`,表示至少有一个数据才计算,否则为NaN。 例如: result = df.resample('3T', label='right').sum(min_periods=1) 但是,`sum`函数本身不支持`min_periods`,我们可以使用`.agg`,例如: result = df.resample('3T', label='right').agg({'value': lambda x: x.sum() if x.count()>=1 else None}) 或者,使用`apply`,但这样可能效率较低。不过,如果用户希望没有数据时得到NaN,我们可以先使用`resample`然后`sum`,再结合`where`条件: count_res = df.resample('3T', label='right').count() sum_res = df.resample('3T', label='right').sum() result = sum_res.where(count_res>=1, None) 但通常,如果数据缺失,用户可能希望直接跳过(即不出现该窗口)?但`resample`会生成所有连续的窗口,包括没有数据的窗口。 因此,如果用户不希望出现没有数据的窗口,可以在聚合后删除NaN值: result = result.dropna() 但是,用户的需求是“相邻三分钟”,所以如果某个三分钟窗口内没有数据,那么该窗口就不应该出现?还是说出现但值为0?这需要用户明确。这里我们按照默认处理(没有数据则和为0)。 不过,在实际情况中,如果窗口内没有数据,我们可能更希望是NaN(表示缺失),而不是0。所以,我们可以使用: result = df.resample('3T', label='right').sum() # 没有数据的地方是0 # 或者,使用以下方法将0替换为NaN(如果原始数据没有0,或者我们明确知道0就是没有数据)?但这样可能不妥。 另一种方法是:先使用`asfreq`,然后再填充,但这里不展开。 所以,根据用户需求,我们给出基本方案。 总结:使用`resample('3T')`,设置`label='right'`,然后`sum()`。 另外,引用中提到: 引用[1]:pandas: DataFrame 将时间按小时分钟等方式聚合 引用[2]:对于下采样,closed可以设置为left或right,用于指定关闭哪一端间隔 引用[3]:label:{‘right’, ‘left’}, 默认值None。用于标记存储桶的容器边缘标签。 因此,我们按照上述方法实现。 如果用户希望窗口是左闭右闭,那么需要设置`closed`参数吗?注意,在分钟数据中,我们通常的窗口是左闭右开(包含开始分钟,不包含结束分钟)。例如,窗口[00:00, 00:03)包含00:00,00:01,00:02。而如果设置`closed='right'`,那么窗口就是(00:00, 00:03],即包含00:01,00:02,00:03。这样第一个窗口就不包含00:00,而包含00:03。所以,我们使用默认的`closed='left'`(左闭右开)即可。 但是,在pandas的resample中,对于下采样,`closed`的默认值是什么?根据引用[3],对于分钟数据(非月份、年等),默认是`left`(即左闭右开)。 因此,我们不需要显式设置`closed`,使用默认值即可。 所以,代码简化为: ```python result = df.resample('3T', label='right').sum() ``` 如果用户希望窗口的起始时间作为标签,那么设置`label='left'`。 根据用户需求,这里我们使用结束时间作为标签(`label='right'`),因为这样更符合“到当前时间为止的三分钟”的语义。 最后,如果用户的数据量很大,可能需要考虑性能,但`resample`对于时间序列是优化过的。 因此,我们给出上述解决方案。</think>### 时间序列数据按分钟聚合计算相邻三分钟总和 在 Pandas 中处理时间序列数据时,可以使用 `resample()` 函数结合 `rolling()` 窗口函数来实现精确到分钟的相邻三分钟聚合计算。以下是完整解决方案: ```python import pandas as pd # 假设df是您的DataFrame,包含时间序列数据 # 确保时间列已转换为datetime类型并设置为索引 df['timestamp'] = pd.to_datetime(df['timestamp']) df = df.set_index('timestamp').sort_index() # 按分钟频率重采样(确保每分钟都有数据点) # 使用asfreq()保持原始值,缺失值用NaN填充 df_minutely = df.asfreq('T') # 计算相邻三分钟的总和(滚动窗口) # min_periods=1表示至少需要1个有效值 result = df_minutely.rolling('3T', min_periods=1).sum() # 重置索引(可选) result.reset_index(inplace=True) ``` ### 关键参数说明: 1. **`rolling('3T')`**: - `'3T'` 表示3分钟的固定时间窗口 - 窗口包含当前时间点及前2分钟的数据(共3分钟) - 例如 10:05 的计算包含 10:03, 10:04, 10:05 的数据 2. **`min_periods=1`**: - 允许窗口内至少有1个非NaN值即可计算 - 避免数据缺失导致的结果为空 3. **`asfreq('T')`**: - 确保时间索引精确到每分钟 - 自动填充缺失时间点(值为NaN) - 保持时间序列的连续性[^1][^2] ### 示例数据演示: 原始数据: ```python timestamp value 2023-01-01 10:00:00 5 2023-01-01 10:02:00 3 # 缺失10:01数据 2023-01-01 10:03:00 2 2023-01-01 10:05:00 4 # 缺失10:04数据 ``` 处理后结果: ``` timestamp value 3min_sum 2023-01-01 10:00:00 5 5.0 # [10:00] 2023-01-01 10:01:00 NaN 5.0 # [10:00-10:01] 含NaN 2023-01-01 10:02:00 3 8.0 # [10:00-10:02] 5+NaN+3 2023-01-01 10:03:00 2 5.0 # [10:01-10:03] NaN+3+2 2023-01-01 10:04:00 NaN 2.0 # [10:02-10:04] 3+2+NaN 2023-01-01 10:05:00 4 6.0 # [10:03-10:05] 2+NaN+4 ``` ### 注意事项: 1. 使用 `asfreq('T')` 前确保时间索引已排序 2. 处理缺失值: - 默认 `sum()` 会忽略NaN值(`5+NaN+3=8`) - 如需严格三分钟数据,设置 `min_periods=3` 3. 窗口边界调整: - 使用 `closed` 参数控制区间包含方式(左闭/右闭)[^2][^3] - 例如 `closed='left'` 排除当前分钟数据
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

掉头发的王富贵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值