关于在 SQL 中创建新变量

Regarding creating a new variable in SQL

我有一个 SQL table (temp2) 这样的:

我想计算每只猫的余额*rate/sum(余额)

所以,我想要的输出是这样的:

为了获得此输出,我使用了以下代码:

DROP TABLE IF EXISTS temp3;
create table temp3 as select cat, balance * rate /sum(balance) as prod from temp2
group by cat 

select temp2.emp_id, temp2.cat,temp2.balance, temp2.rate , temp3.prod from temp2 
left outer join temp3 on temp2.cat=temp3.cat

所以我在这里创建了一个新的 table 来获得答案。 是否有更简单的方法来获得相同的结果?

不需要新的 table,除非您需要在多个查询中引用它。您可以只加入一个子查询。

SELECT t2.emp_id, t2.cat, t2.balance, t2.rate, t3.prod
FROM temp2 AS t2
JOIN (
    SELECT cat, balance * rate /sum(balance) AS prod 
    FROM temp2
    GROUP BY cat
) AS t3 ON t2.cat = t3.cat

不需要使用LEFT JOIN。由于子查询从同一个 table 中获取 cat,因此不能有任何 non-matching 行。

有时创建新的 table 很有用,这样您就可以出于性能原因添加索引。

由于 window 函数,您实际上根本不需要连接或子查询:

SELECT emp_id, cat, balance, rate,
       balance * rate / sum(balance) OVER (PARTITION BY cat) AS prod
FROM temp2
ORDER BY emp_id;

给予

emp_id  cat  balance  rate  prod              
------  ---  -------  ----  ------------------
1       1    1000.0   0.25  0.0625            
2       3    1250.0   0.25  0.0568181818181818
3       2    1500.0   0.25  0.0681818181818182
4       1    1000.0   0.25  0.0625            
5       2    1250.0   0.25  0.0568181818181818
6       3    1500.0   0.25  0.0681818181818182
100     1    1000.0   0.25  0.0625            
101     3    1250.0   0.25  0.0568181818181818
102     2    1500.0   0.25  0.0681818181818182
103     1    1000.0   0.25  0.0625            
104     2    1250.0   0.25  0.0568181818181818
105     3    1500.0   0.25  0.0681818181818182

(在 temp2.cat 上创建索引以获得最佳性能)。

这样也比较准确;你和 Barmar 都在分组查询中使用 balancerate 而没有在 GROUP BY 子句中包含这些值 - 这在大多数数据库中都是错误的,但是 Sqlite 会从组中随机选择一行用作值,当组中的不同行具有不同的值时,将抛出最终计算。要正确地进行分组(例如,如果您使用的是不支持 window 函数的旧数据库版本),您需要类似

SELECT t2.emp_id, t2.cat, t2.balance, t2.balance * t2.rate / t3.sumbalance AS prod
FROM temp2 AS t2
JOIN (SELECT cat, sum(balance) AS sumbalance
      FROM temp2
      GROUP BY cat) AS t3
ON t2.cat = t3.cat
ORDER BY t2.emp_id;