python - 当有多个同名时更新sqlite数据库中的值
问题描述
我会尽力解释我的问题。
我正在研究cs50,C$50 Finanace
目前正在实现一个名为sell 的函数。此功能的目的是将特定用户的现金价值更新到数据库中并更新他的投资组合。
我正在努力更新投资组合数据库。
这是为了更好地澄清数据库查询:
CREATE TABLE 投资组合(id INTEGER,用户名 TEXT NOT NULL,符号 TEXT NOT NULL,共享 INTEGER,PRIMARY KEY(id));
假设我有这些值:
编号 | 用户名 | 符号 | 分享
1 | 阿姆 | 苹果 | 20
2 | 阿姆 | NFLX | 5
3 | 阿姆 | 苹果 | 5
用户出售他的一些股票。我必须更新shares
. 如果是NFLX
符号,那很容易。像下面这样的简单查询就足够了
db.execute("更新投资组合 SET share=shares - ? WHERE username=? AND symbol=?", int(shares), username, quote["symbol"])
但是,如果我想要更新AAPL
共享,这就是问题出现的地方。如果我执行上面的查询,假设用户卖出了 5 股,上面的查询会将AAPL
id1
和20 中的股份都更改3
为 20,使总股份AAPL
变为 40 而不是 20。
我应该考虑哪种方法?在将它们插入portfolio
表格之前,我应该根据符号对股票进行分组吗?如果是这样,怎么做?或者有没有可以解决我的问题的查询?
解决方案
如果您的 SQLite 版本是 3.33.0+,则使用如下UPDATE...FROM
语法:
UPDATE portfolio AS p
SET shares = (p.id = t.id) * t.shares_left
FROM (
SELECT MIN(id) id, username, symbol, shares_left
FROM (
SELECT *, SUM(shares) OVER (ORDER BY id) - ? shares_left -- change ? to the number of stocks the user sold
FROM portfolio
WHERE username = ? AND symbol = ?
)
WHERE shares_left >= 0
) AS t
WHERE p.username = t.username AND p.symbol = t.symbol AND p.id <= t.id;
窗口函数SUM()
返回份额的增量总和,直到达到已售出的份额数。
该UPDATE
语句将在所有id
小于第一个id
超过已售股票的行中,将与等于第一个的行中超过已售股票的列shares
设置为增量总和与已售数量之间的差值分享。0
id
id
查看简化的演示。
对于以前的版本,您可以使用:
WITH
cte AS (
SELECT MIN(id) id, username, symbol, shares_left
FROM (
SELECT *, SUM(shares) OVER (ORDER BY id) - ? shares_left -- change ? to the number of stocks the user sold
FROM portfolio
WHERE username = ? AND symbol = ?
)
WHERE shares_left >= 0
)
UPDATE portfolio
SET shares = (id = (SELECT id FROM cte)) * (SELECT shares_left FROM cte)
WHERE (username, symbol) = (SELECT username, symbol FROM cte) AND id <= (SELECT id FROM cte)
查看简化的演示。
推荐阅读
- mysql - Moodle:为自定义用户配置文件字段组合两个 SQL
- two-factor-authentication - 如何从链接打开 Google Authenticator?
- excel - RANK() 公式排除虚拟列中具有特定值的行
- python - 将 xml 转换为 csv 并依靠 python
- python - 无法将输入数组从形状 (0,495,64,1) 广播到形状 (496,64,1)
- regex - 否定/反转字符类无法匹配 perl 中的方括号
- android - 无法在 kotlin 的 recyclerview 中按部分正确显示项目
- git - Git 路径模式 - 搜索文件忽略文件夹和扩展名
- java - javax @Transactional 在使用支持事务的关系数据库驱动程序时是否使用数据库级事务?
- d3.js - 我收到一个未捕获的错误:不匹配的匿名 define() 模块: