Daily_work20100819------Aug

一位刚从学校毕业的程序员分享了自己在上海的工作日常:乘坐公交上下班、公司的网络问题及由此引发的工作调整,还有对运营项目中客户需求变化的看法。

TIME: 20100819

ADDR: SH PD

COM: Aug

---------------------------------------------------------------------------------------------------------Daily- Work-----------------------------------------------------------------------

 

流水账:

  最近几天都没有骑车上班了,上海的早上很热,三块钱做上小黑去了公司,到公司后,冲一一杯奶,一边喝一边看看新闻,公司不知道为什么近来网速很慢,搞的SDM一个个查电脑。哎!!!

  开始工作了,昨天老大说十二点之后不能check in 代码,可是昨天svn 挂了,今天又不能上传,就只有接着做了,昨天给我的任务做了一半,早上一来就是接着做,不知道这个运营项目做到什么时间,客户一句话,“我加钱,你帮我改”, 我们可就不爽了,但是对我样我这样的刚从学校出来的,能有什么要求呢,

 

潮汐研究作为海洋科学的关键分支,融合了物理海洋学、地理信息系统及水利工程等多领域知识。TMD2.05.zip是一套基于MATLAB环境开发的潮汐专用分析工具集,为科研人员与工程实践者提供系统化的潮汐建模与计算支持。该工具箱通过模块化设计实现了两大核心功能: 在交互界面设计方面,工具箱构建了图形化操作环境,有效降低了非专业用户的操作门槛。通过预设参数输入模块(涵盖地理坐标、时间序列、测站数据等),用户可自主配置模型运行条件。界面集成数据加载、参数调整、可视化呈现及流程控制等标准化组件,将复杂的数值运算过程转化为可交互的操作流程。 在潮汐预测模块中,工具箱整合了谐波分解法与潮流要素解析法等数学模型。这些算法能够解构潮汐观测数据,识别关键影响要素(包括K1、O1、M2等核心分潮),并生成不同时间尺度的潮汐预报。基于这些模型,研究者可精准推算特定海域的潮位变化周期与振幅特征,为海洋工程建设、港湾规划设计及海洋生态研究提供定量依据。 该工具集在实践中的应用方向包括: - **潮汐动力解析**:通过多站点观测数据比对,揭示区域主导潮汐成分的时空分布规律 - **数值模型构建**:基于历史观测序列建立潮汐动力学模型,实现潮汐现象的数字化重构与预测 - **工程影响量化**:在海岸开发项目中评估人工构筑物对自然潮汐节律的扰动效应 - **极端事件模拟**:建立风暴潮与天文潮耦合模型,提升海洋灾害预警的时空精度 工具箱以"TMD"为主程序包,内含完整的函数库与示例脚本。用户部署后可通过MATLAB平台调用相关模块,参照技术文档完成全流程操作。这套工具集将专业计算能力与人性化操作界面有机结合,形成了从数据输入到成果输出的完整研究链条,显著提升了潮汐研究的工程适用性与科研效率。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
-- 步骤 1: 创建临时表存储分组平均值 WITH daily_avg AS ( SELECT province_id,province_name,city_org_id,city_org_name,maintainer_id,maintainer_name,maintcrew_id,maintcrew_name,cust_type,ccflag,fc_gc_flag,org_level, AVG(cover_rate) AS avg_cover_rate -- 计算分组平均值 FROM analy.vs_cust_org_voltrate WHERE period_type = '01' -- 日数据 AND statistic_time like '%202509%' -- 2025年9月范围 GROUP BY province_id,province_name,city_org_id,city_org_name,maintainer_id,maintainer_name,maintcrew_id,maintcrew_name,cust_type,ccflag,fc_gc_flag,org_level -- 按指定字段分组 ) -- 步骤 2: 更新月数据 UPDATE analy.vs_cust_org_voltrat AS monthly SET COVER_RATE = daily_avg.avg_cover_rate -- 更新目标字段 FROM daily_avg WHERE monthly.period_type = '02' -- 月数据 AND monthly.statistic_time = '202509' -- 2025年9月 AND monthly.province_id = daily_avg.province_id -- 关联字段1 AND monthly.province_name = daily_avg.province_name; -- 关联字段2 AND monthly.city_org_id = daily_avg.city_org_id -- 关联字段3 AND monthly.city_org_name = daily_avg.city_org_name; -- 关联字段4 AND monthly.maintainer_id = daily_avg.maintainer_id -- 关联字段5 AND monthly.maintainer_name = daily_avg.maintainer_name; -- 关联字段6 AND monthly.maintcrew_id = daily_avg.maintcrew_id -- 关联字段7 AND monthly.maintcrew_name = daily_avg.maintcrew_name; -- 关联字段8 AND monthly.cust_type = daily_avg.cust_type -- 关联字段9 AND monthly.ccflag = daily_avg.ccflag; -- 关联字段10 AND monthly.fc_gc_flag = daily_avg.fc_gc_flag; -- 关联字段11 AND monthly.org_level = daily_avg.org_level; -- 关联字段12 执行后报错没有daily_avg表
10-10
<think>我们之前已经分析过,原CTE定义后缺少主查询会导致整个SQL无法执行。但现在用户意图是使用这个CTE(daily_avg)来更新月数据,因此整个SQL应该是一个UPDATE语句,但更新语句中如何引用CTE呢? 用户需求:先用CTE(daily_avg)计算分组平均值,然后用这些平均值去更新月数据(可能是同一张表或其他表中的月数据)。 问题:执行报错“没有daily_avg表”,这意味着在更新语句中无法识别daily_avg。 原因分析: 在SQL中,CTE(即WITH子句)必须紧跟着使用它的DML语句(如SELECT, INSERT, UPDATE, DELETE)。如果更新语句没有正确关联,就会导致找不到CTE。 解决方案: 我们需要将CTE放在UPDATE语句之前,并在UPDATE的FROM子句或SET子句中引用CTE。 假设更新逻辑: 假设目标表是同一个表(analy.vs_cust_org_voltrate),我们要更新月数据(period_type='02')的cover_rate字段,用CTE中计算的日平均值的平均值(即分组平均值)来更新。 注意:更新月数据时,需要将CTE与目标表进行连接,确保用正确的分组平均值更新对应的月记录。 步骤: 1. 在UPDATE语句前定义CTE(daily_avg)。 2. 在UPDATE语句中,将目标表与CTE通过分组字段(如province_id, city_org_id等)进行连接。 3. 注意更新条件:只更新月数据(period_type='02')且统计时间为2025年9月(可能是statistic_time='202509',注意月数据的格式可能不同)。 注意:原CTE中统计时间是日数据(period_type='01')且statistic_time包含'202509',更新的是月数据(period_type='02')且statistic_time可能是'202509'(表示2025年9月)。 示例代码结构: ```sql WITH daily_avg AS ( SELECT province_id, province_name, city_org_id, city_org_name, maintainer_id, maintainer_name, maintcrew_id, maintcrew_name, cust_type, ccflag, fc_gc_flag, org_level, AVG(cover_rate) AS avg_cover_rate FROM analy.vs_cust_org_voltrate WHERE period_type = '01' -- 日数据 AND statistic_time LIKE '%202509%' -- 2025年9月的日数据 GROUP BY province_id, province_name, city_org_id, city_org_name, maintainer_id, maintainer_name, maintcrew_id, maintcrew_name, cust_type, ccflag, fc_gc_flag, org_level ) UPDATE analy.vs_cust_org_voltrate AS target SET cover_rate = da.avg_cover_rate -- 用日平均值的平均值更新月数据的cover_rate FROM daily_avg da -- 这里需要注意不同数据库的UPDATE..FROM语法 WHERE target.period_type = '02' -- 月数据 AND target.statistic_time = '202509' -- 月数据的统计时间,具体格式根据实际情况,这里假设为'202509' -- 连接条件:确保分组字段匹配 AND target.province_id = da.province_id AND target.province_name = da.province_name -- 注意:如果province_id已经唯一确定province_name,则可以不使用province_name,但原分组有,所以这里也要 ... -- 其他分组字段都要作为连接条件 AND target.city_org_id = da.city_org_id AND target.maintainer_id = da.maintainer_id ...; -- 等等所有分组字段 ``` 但注意:不同数据库的UPDATE语法可能有差异: - 在PostgreSQL和SQL Server中,支持UPDATE..FROM语法。 - 在MySQL中,不支持UPDATE..FROM,而是采用多表更新(UPDATE table1, table2 ...)或使用JOIN(UPDATE table1 JOIN table2 ON ...)。 - 在Oracle中,可以使用UPDATE ... SET ... FROM ... WHERE ...(但Oracle的语法略有不同,或者使用子查询)。 因此,我们需要根据使用的数据库调整语法。 以PostgreSQL为例(支持UPDATE..FROM): ```sql WITH daily_avg AS ( ... ) UPDATE analy.vs_cust_org_voltrate AS target SET cover_rate = da.avg_cover_rate FROM daily_avg da WHERE target.period_type = '02' AND target.statistic_time = '202509' -- 月数据的时间格式,这里假设为'202509' AND target.province_id = da.province_id AND target.province_name = da.province_name AND target.city_org_id = da.city_org_id AND target.city_org_name = da.city_org_name AND target.maintainer_id = da.maintainer_id AND target.maintainer_name = da.maintainer_name AND target.maintcrew_id = da.maintcrew_id AND target.maintcrew_name = da.maintcrew_name AND target.cust_type = da.cust_type AND target.ccflag = da.ccflag AND target.fc_gc_flag = da.fc_gc_flag AND target.org_level = da.org_level; ``` 然而,上面的连接条件非常长,而且如果分组字段中有NULL值,那么条件可能不成立(因为NULL不等于NULL)。我们可以考虑使用唯一标识的字段(如主键)来避免这么多连接条件?但原分组字段较多,且没有主键信息。 替代方案:如果目标表中存在唯一键,我们可以将连接条件简化为关键字段(比如业务上能唯一确定一组的字段)?但原逻辑是12个字段的分组,所以必须用这12个字段来匹配。 另外,注意:月数据可能已经存在,也可能不存在。如果不存在,则更新0行;如果存在多条(理论上不应该,因为分组字段在月数据中也应该唯一),则更新多条。 如果数据库不支持UPDATE..FROM(如MySQL),则使用以下语法: MySQL写法: ```sql WITH daily_avg AS ( ... ) UPDATE analy.vs_cust_org_voltrate AS target JOIN daily_avg da ON target.province_id = da.province_id AND target.province_name = da.province_name ... -- 所有12个字段 SET target.cover_rate = da.avg_cover_rate WHERE target.period_type = '02' AND target.statistic_time = '202509'; ``` 如果报错“没有daily_avg表”,可能是数据库版本不支持在UPDATE语句中使用CTE(尤其是较老的MySQL版本)。在MySQL 8.0以上支持CTE,而5.7版本不支持在UPDATE中使用CTE(但支持在SELECT中使用)。在这种情况下,我们可以将CTE改为临时表。 临时表方案(通用且避免CTE兼容性问题): 1. 先创建临时表,插入分组平均值。 2. 然后更新目标表,通过连接这个临时表。 示例(以MySQL为例): ```sql -- 步骤1:创建临时表 CREATE TEMPORARY TABLE temp_daily_avg AS SELECT province_id, province_name, city_org_id, city_org_name, maintainer_id, maintainer_name, maintcrew_id, maintcrew_name, cust_type, ccflag, fc_gc_flag, org_level, AVG(cover_rate) AS avg_cover_rate FROM analy.vs_cust_org_voltrate WHERE period_type = '01' -- 日数据 AND statistic_time LIKE '%202509%' GROUP BY province_id, province_name, city_org_id, city_org_name, maintainer_id, maintainer_name, maintcrew_id, maintcrew_name, cust_type, ccflag, fc_gc_flag, org_level; -- 步骤2:更新 UPDATE analy.vs_cust_org_voltrate AS target JOIN temp_daily_avg da ON target.province_id = da.province_id AND target.province_name = da.province_name AND target.city_org_id = da.city_org_id AND target.city_org_name = da.city_org_name AND target.maintainer_id = da.maintainer_id AND target.maintainer_name = da.maintainer_name AND target.maintcrew_id = da.maintcrew_id AND target.maintcrew_name = da.maintcrew_name AND target.cust_type = da.cust_type AND target.ccflag = da.ccflag AND target.fc_gc_flag = da.fc_gc_flag AND target.org_level = da.org_level SET target.cover_rate = da.avg_cover_rate WHERE target.period_type = '02' AND target.statistic_time = '202509'; -- 假设月数据的时间格式为'202509' -- 步骤3(可选):删除临时表(在会话结束时会自动删除) DROP TEMPORARY TABLE temp_daily_avg; ``` 注意:临时表只在当前会话存在,且不会与现有表冲突。 另一种方法:使用子查询代替CTE(但可能会影响性能,尤其是当分组结果很大时): ```sql UPDATE analy.vs_cust_org_voltrate AS target JOIN ( SELECT province_id, province_name, city_org_id, city_org_name, maintainer_id, maintainer_name, maintcrew_id, maintcrew_name, cust_type, ccflag, fc_gc_flag, org_level, AVG(cover_rate) AS avg_cover_rate FROM analy.vs_cust_org_voltrate WHERE period_type = '01' AND statistic_time LIKE '%202509%' GROUP BY province_id, province_name, city_org_id, city_org_name, maintainer_id, maintainer_name, maintcrew_id, maintcrew_name, cust_type, ccflag, fc_gc_flag, org_level ) AS da ON (target.province_id = da.province_id AND ... ) -- 所有分组字段 SET target.cover_rate = da.avg_cover_rate WHERE target.period_type = '02' AND target.statistic_time = '202509'; ``` 总结解决方法: 1. 如果数据库支持CTE且在UPDATE中可用,则使用CTE(如PostgreSQL, SQL Server, MySQL 8.0+)。 2. 如果数据库不支持在UPDATE中使用CTE(如MySQL 5.7),则使用临时表或子查询。 根据用户报错“没有daily_avg表”,很可能是因为数据库不支持在UPDATE语句中直接使用CTE(或者语法错误)。因此,建议采用临时表方案,它更通用。 此外,还要注意: - 更新条件中的时间格式:月数据的statistic_time是'202509',而日数据是包含'202509'的字符串(如'20250901'),这需要确认。 - 分组字段中包含字符串字段,如果存在大小写或空格不一致,可能导致连接失败。确保这些字段在两种数据中是相同的(或使用trim、统一大小写)。 - 连接条件中的字段值可能有NULL,需要特殊处理(例如使用<=>运算符在MySQL中,或者COALESCE函数)。 因此,建议先检查分组字段中是否有NULL,如果有,则连接条件应处理NULL(例如使用COALESCE赋予默认值,或者使用IS NULL判断)。 示例处理NULL的连接条件(MySQL): ```sql ON (target.province_id <=> da.province_id) -- <=> 是MySQL中的NULL安全等于 AND (target.province_name <=> da.province_name) ... -- 其他字段 ``` 但在标准SQL中,可以使用: ```sql ON (target.province_id = da.province_id OR (target.province_id IS NULL AND da.province_id IS NULL)) AND (target.province_name = da.province_name OR (target.province_name IS NULL AND da.province_name IS NULL)) ... ``` 但这样写很冗长,所以如果可能,尽量避免分组字段出现NULL(或者使用临时表时,将NULL替换为一个特殊值,例如空字符串或'NULL',但需谨慎)。 最后,由于用户提到“更新月数据”,我们假设月数据已经存在。如果不存在,则需要先插入(但用户需求是更新)。 建议:在执行更新之前,先验证临时表(或CTE)中的数据以及连接条件是否准确。 例如,先查询: ```sql WITH daily_avg AS ( ... ) SELECT * FROM analy.vs_cust_org_voltrate AS target JOIN daily_avg da ON ... -- 连接条件 WHERE target.period_type='02' AND target.statistic_time='202509'; ``` 这样可以查看哪些记录会被更新。 综上所述,针对用户的问题,我推荐使用临时表方案,因为它兼容性更好,避免CTE在更新语句中的使用限制。具体步骤见上面临时表方案的代码。 注意:在大型表上操作时,临时表创建和更新都需要索引优化以提高性能,但此处由于是临时表且数据量未知,可以暂时不考虑索引。如果数据量大,可以在临时表上创建索引(但临时表在MySQL中支持索引)。 引用说明:引用[1]中提到将报告数据存储在新的自定义表中,这里我们使用临时表也是为了分离计算步骤,避免直接操作大表扫描带来的性能问题[^1]。引用[2]中展示了表连接的条件匹配逻辑,我们更新语句中的连接条件同样需要精确匹配多个字段[^2]。 </think>### 解决SQL执行报错"没有daily_avg表"的方法 您遇到的问题是因为CTE(公用表表达式)**daily_avg**的作用域仅限于当前查询语句。当您尝试在单独的更新语句中引用它时,数据库无法识别这个临时表。以下是完整的解决方案: #### 方案1:使用单个语句合并CTE和UPDATE(推荐) ```sql WITH daily_avg AS ( SELECT province_id, province_name, city_org_id, city_org_name, maintainer_id, maintainer_name, maintcrew_id, maintcrew_name, cust_type, ccflag, fc_gc_flag, org_level, AVG(cover_rate) AS avg_cover_rate FROM analy.vs_cust_org_voltrate WHERE period_type = '01' AND statistic_time LIKE '%202509%' GROUP BY province_id, province_name, city_org_id, city_org_name, maintainer_id, maintainer_name, maintcrew_id, maintcrew_name, cust_type, ccflag, fc_gc_flag, org_level ) UPDATE analy.vs_cust_org_voltrate AS target SET cover_rate = da.avg_cover_rate FROM daily_avg da WHERE target.period_type = '02' -- 月数据 AND target.statistic_time = '202509' -- 月数据时间格式 -- 确保所有分组字段匹配 AND target.province_id = da.province_id AND target.city_org_id = da.city_org_id AND target.maintainer_id = da.maintainer_id AND target.maintcrew_id = da.maintcrew_id AND target.cust_type = da.cust_type -- 添加其他分组字段匹配条件... ``` #### 方案2:使用临时物理表(兼容性最佳) ```sql -- 创建物理临时表 CREATE TEMPORARY TABLE temp_daily_avg AS SELECT province_id, province_name, city_org_id, city_org_name, maintainer_id, maintainer_name, maintcrew_id, maintcrew_name, cust_type, ccflag, fc_gc_flag, org_level, AVG(cover_rate) AS avg_cover_rate FROM analy.vs_cust_org_voltrate WHERE period_type = '01' AND statistic_time LIKE '%202509%' GROUP BY province_id, province_name, city_org_id, city_org_name, maintainer_id, maintainer_name, maintcrew_id, maintcrew_name, cust_type, ccflag, fc_gc_flag, org_level; -- 使用临时表更新月数据 UPDATE analy.vs_cust_org_voltrate AS target JOIN temp_daily_avg da ON target.province_id = da.province_id AND target.city_org_id = da.city_org_id AND target.maintainer_id = da.maintainer_id -- 添加其他连接字段... SET target.cover_rate = da.avg_cover_rate WHERE target.period_type = '02' AND target.statistic_time = '202509'; -- 清理临时表(可选) DROP TABLE temp_daily_avg; ``` ### 关键注意事项 1. **连接条件完整性** 必须包含所有12个分组字段作为连接条件,确保1:1匹配: ```sql AND target.province_id = da.province_id AND target.province_name = da.province_name ... -- 所有12个字段 ``` 2. **时间格式处理** 月数据建议使用精确匹配: ```sql AND target.statistic_time = '202509' -- 替代LIKE ``` 3. **空值处理** 如果字段可能为NULL,使用安全比较: ```sql AND (target.maintainer_id <=> da.maintainer_id) -- MySQL的NULL安全比较 ``` 4. **性能优化** 大数据量时: - 在临时表创建索引 ```sql CREATE INDEX idx_temp ON temp_daily_avg(province_id, city_org_id, ...); ``` - 批处理更新(每次更新10万行) > 引用[1]说明了分离报表数据的重要性,这里使用临时表正是遵循这一最佳实践,避免直接操作生产数据[^1]。引用[2]演示了多字段连接条件的使用逻辑[^2]。 ### 验证步骤 1. 先运行CTE部分验证数据: ```sql WITH daily_avg AS (...) SELECT * FROM daily_avg; ``` 2. 使用EXPLAIN分析更新计划 3. 在测试环境执行小范围更新验证
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值