select id, (sum(col2) - sum(col1)) as net_col1_col2
from data4sim
where end_time <= :input_time
and (sum(col2) + sum(col1)) > 0
and (
(sum(col1) + sum(col2))
<= abs(coalesce(col3, 0) - (col4 - (sum(col2) - sum(col1)))) + :EPS
)
group by id
这是我第一次使用 SQL,我正在尝试编写一个以上述条件为条件的查询。我注意到我正在计算
(sum(col1) + sum(col2))
和 (sum(col2) - sum(col1))
两次,并且我不确定如何存储中间结果,以便我可以在第二次中重用它。
我可以做这样的事情吗:
where time < :input_time
and (sum(col1) + sum(col2)) as temp
and (temp > 0)
and (temp < col3) <= ....
我认为总的来说,我不知道如何在条件中存储中间结果。
在 sqlite 中,您可以在 SELECT 子句中为列添加别名,然后在 HAVING 子句中引用该别名(这是您应该移动基于聚合构建的条件(如
SUM()
)的位置。
CREATE TABLE test (id integer, val1 integer, val2 integer);
INSERT INTO test (id, val1, val2) VALUES (1,1,5);
INSERT INTO test (id, val1, val2) VALUES (2,3,6);
INSERT INTO test (id, val1, val2) VALUES (3,5,7);
SELECT SUM(val1 + val2) as derived_col
FROM test
WHERE id IN (1,2)
HAVING derived_col > 3;
我不知道你的数据,但类似这样的事情应该可以做到:
select id,
(sum(col2) - sum(col1)) as net_col1_col2,
(sum(col2) + sum(col1)) as total
from data4sim
where end_time <= :input_tum
group by id
having total > 0
and total <= abs(coalesce(col3, 0) - (col4 - net_col1_col2)) + :EPS
您可以在
select
子句中使用 having
中的别名。