Odoo按城市分组获取昨日及今日数据最大值的技术问询
嘿,我刚看完你的问题——你要按城市分组取昨日(对应每个城市的前2条数据)和今日(该城市剩余数据)的数值最大值,但之前写的代码返回的所有城市最大值都一样对吧?这大概率是分组排序的逻辑没处理对,我来给你一步步解决:
先明确核心需求
数据库中存在多城市多日期的数据,需按城市分组,分别获取每个城市**昨日(该城市的前2条数据)和今日(该城市剩余数据)**的数值最大值。
解决方案代码
步骤1:给每个城市的数据按日期排序编号
首先得确保每个城市的数据是按日期顺序排列的,这样前2条才对应昨日数据。我们用窗口函数ROW_NUMBER()给每个城市的数据单独编号:
WITH ranked_city_data AS ( SELECT city, value, -- 按城市分组,再按日期升序给数据编号(日期早的在前) ROW_NUMBER() OVER (PARTITION BY city ORDER BY date_column ASC) AS row_num FROM your_table_name )
这里的关键是PARTITION BY city——它会让每个城市的数据单独排序,而不是全局混排(这就是你之前所有城市最大值相同的核心原因!)。
步骤2:按城市分组计算最大值
接着根据编号区分昨日(row_num ≤2)和今日(row_num >2),再用聚合函数取各自的最大值:
SELECT city, -- 取昨日(前2条)的最大值 MAX(CASE WHEN row_num <= 2 THEN value END) AS yesterday_max, -- 取今日(剩余)的最大值 MAX(CASE WHEN row_num > 2 THEN value END) AS today_max FROM ranked_city_data GROUP BY city ORDER BY city;
针对你的示例数据测试
用你给出的示例数据跑上面的代码,会得到这样的结果:
| city | yesterday_max | today_max |
|---|---|---|
| A | 62 | 98 |
| B | 85 | 55 |
| C | 74 | 96 |
常见错误排查
如果之前的代码所有城市最大值相同,90%是因为没加PARTITION BY city——这会导致整个表的数据全局排序,而不是每个城市单独排序,最终分组计算时就会把所有城市的最值混在一起。
内容的提问来源于stack exchange,提问作者user_123
相关产品推荐
相关产品推荐

