我有一个涉及Postgresql数据库的任务。我对SQL不太有经验。
我有一张桌子,上面有每周贸易产品的营业额。
对于每周,提供以下信息:产品,周数,每周营业额(可能是正数,也可能是负数,具体取决于天气是购买还是出售了更多产品)。我已经添加了一个列,每个星期都有期末余额。我在表中的第一周所有产品的期末余额(week_number= 0),而其他所有周均为“ null”。下面提供了一些示例性记录。
product | week_number | turnover | closing_balace
--------------------------------+-------------+----------+----------------
BLGWK-05.00*1250*KR-S235JRN0-A | 0 | 50.00 | 1240.00
BLGWK-05.00*1250*KR-S355J2CN-K | 0 | 45.70 | 455.75
BLGWK-05.00*1464*KR-DD11NIET-K | 0 | 30.01 | 300.00
BLGWK-05.00*1500*KR-DD11NIET-R | 1 | 10.22 |
BLGWK-05.00*1500*KR-S235J2CU-K | 1 | 88.00 |
我需要一个查询,以使用以下计算来填充所有“空”的“ closeing_balance”:
closing_balance = closing_balance of the same product for previous week + turnover for the week.
我试过这个查询:
update table_turnover
set closing_balance = (select lag(closing_balance, 1) over (partition by product order by week_number) + turnover)
where week_number > 0;
它从未成功过-高于“第0周”的“ closed_balance”的“空”值仍然为“空”。
我也尝试过:
update table_turnover
set closing_balance = (select
case when week_number = 0
then closing_balance
else (lag(closing_balance, 1) over (partition by product order by week_number) + turnover)
end
from table_turnover)
这产生一个错误
子查询返回的多个记录用作表达式
知道如何进行此计算吗?
先感谢您。
在from
子句中使用子查询:
update table_turnover
set closing_balance = (ttprev.prev_closing_balance + ttprev.turnover)
from (select tt.*,
lag(closing_balance) over (partition by product order by
week_number) as prev_closing_balance
from table_turnover tt
) ttprev
where ttprev.product = tt.product and ttprev.week_number = tt.week_number and
week_number > 0;
或者,如果您想在中使用子查询select
:
update table_turnover
set closing_balance = (turnover +
(select tt2.closing_balance
from table_turnover tt2
where tt2.product = tt.product and tt2.week_number = tt.week_number - 1
)
)
where week_number > 0;
为了提高性能(在任何一个版本上),您都希望在上建立索引table_turnover(product, week_number, closing_balance)
。
问题内容: 我有一个很大的PostgreSQL表,可以通过Django访问。因为Django的ORM不支持窗口函数,所以我需要将窗口函数的结果作为常规列烘烤到表中。我想做这样的事情: 但是我明白了 有人可以建议替代方法吗?通过Django的.raw()方法传递窗口函数语法是不合适的,因为它返回RawQuerySet,它不支持其他ORM功能,例如我需要的.filter()。 谢谢。 问题答案: 错误
本文向大家介绍PostgreSQL数据库中窗口函数的语法与使用,包括了PostgreSQL数据库中窗口函数的语法与使用的使用技巧和注意事项,需要的朋友参考一下 什么是窗口函数? 一个窗口函数在一系列与当前行有某种关联的表行上执行一种计算。这与一个聚集函数所完成的计算有可比之处。但是窗口函数并不会使多行被聚集成一个单独的输出行,这与通常的非窗口聚集函数不同。取而代之,行保留它们独立的标识。在这些现象
我从geofabrik.de下载了我国家的OSM数据,成功地将其导入到安装在Ubuntu 16.04上的PostgreSQL 9.6中,并使用了几次。我还创建了Web应用程序,它可以正常工作。所以我决定添加另一个功能,从一些点返回最近的特殊点(例如餐馆)。对于一个最近的点,它可以工作,但是当我想要返回它们的数组时,它不工作。于是我分解了自己的问题,发现了奇怪的行为。当我执行以下查询: 它返回: 当
问题内容: 好的,起初这只是和我的一个朋友开玩笑,但后来变成了有趣的技术问题:) 我有下表: 该表包含我所有东西的记录,并分别具有数量和优先级(我需要多少)。 我有一个指定体积的袋子,例如。我想从表中选择所有可以放入袋子的东西,首先包装最重要的东西。 这似乎是使用窗口函数的情况,所以这是我想出的查询: 但是,问题在于Postgres抱怨: 如果我删除此过滤器,则会正确计算总列,对结果进行正确排序,
问题内容: 我正在尝试通过将新记录更新或插入新的记录到 voice_user_table中 来更新数据库。该表定义如下: 这是我正在使用的查询。我实际上对所有值都使用了参数,但是出于测试目的,我将其替换为我确定应该可以使用的值。用户名 aaa@aaa.com 存在。 运行查询后,我得到的输出是: 尽管应该插入新值,但是因为该行在数据库上尚不存在。当我仅使用insert子句手动插入一行,然后执行上面