我有一个包含多个price-timestamp
元组的表:
#mytable;
id;<somecolumns>;price1;timestamp1;price2;timestamp2;
我想导出临时表中的每个价格-时间戳记元组,但仅导出其时间戳记在特定时间间隔内的价格:
#mytemp
id;price1;price2;
我可以通过为每个元组重复sql来实现此目的:
INSERT INTO mytemp (price1)
SELECT price1 FROM mytable WHERE timestamp1 > NOW() - INTERVAL 3 HOUR;
INSERT INTO mytemp (price2)
SELECT price2 FROM mytable WHERE timestamp2 > NOW() - INTERVAL 3 HOUR;
#repeat for all price-timestamp tuples
问题:我可以将此优化为一个单独的SQL查询吗?
答案 0 :(得分:3)
您可以在以下情况下使用大小写
SELECT
sum(case when timestamp1 > NOW() - INTERVAL 3 HOUR then price1 else 0 end) as price1,
sum(case when timestamp2 > NOW() - INTERVAL 3 HOUR then price2 else 0 end)
as price2
FROM mytable ;
但是如果要插入,只需选择
INSERT INTO mytemp (price1,price2)
SELECT
sum(case when timestamp1 > NOW() - INTERVAL 3 HOUR then price1 else 0 end) as price1,
sum(case when timestamp2 > NOW() - INTERVAL 3 HOUR then price2 else 0 end)
as price2
FROM mytable
答案 1 :(得分:1)
使用4
case when
答案 2 :(得分:0)
尝试
SELECT price1 , '' as price2 from testa WHERE timestamp1 > NOW() - INTERVAL 3 HOUR
UNION
SELECT '' as price1, price2 as price from testa WHERE timestamp2 > NOW() - INTERVAL 3 HOUR
答案 3 :(得分:0)
您可以使用cross join
取消显示数据:
select (case when n.n = 1 then price1
when n.n = 2 then price2
end),
(case when n.n = 1 then timestamp1
when n.n = 2 then timestamp2
end)
from t cross join
(select 1 as n union all select 2) n
having timestamp > now() - interval 3 hour;
但是,如果您在union all
上有索引,则您的方法或与timestamp
等效的方法可能是最快的方法。