关于在 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 都在分组查询中使用 balance
和 rate
而没有在 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;
我有一个 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 都在分组查询中使用 balance
和 rate
而没有在 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;