<分区>
我在 SQL 中有一个使用连接的 View ,它花费的时间比我希望的要长得多。我认为如果我将它转换为子查询它会运行得更快,但我遇到了麻烦。
基本上,我想创建一个“目标”列来计算 Assets 价格 24 小时的百分比变化。现在,我的方法是创建第一个 View ,它是普通表,然后是第二个 View ,它是第一个表的副本,但带有 date+1,然后我可以用它来计算 24 小时目标。下面是我的sql代码。我在 MySQL 工作。
create view PricesView1 as
select Date,Symbol, avg(Price) as 'Price', avg(BTC_Dominance) as 'BTC_Dominance',
pkdummy,pkey from Prices group by Date,pkdummy,pkey, Symbol
having right(pkdummy,2)=22 and Date > '2018-11-22';
create view PricesView2 as
select sq.Date, sq.oldDate, sq.Symbol, sq.Price, newP.Price as 'NewPrice',
newP.BTC_Dominance as 'NewBTCdominance', newP.pkdummy from (
select date_add(Date, INTERVAL 1 DAY) as 'Date', Date as 'oldDate',Symbol,avg(Price) as 'Price',
avg(BTC_Dominance) as 'BTC_Dominance', pkdummy,pkey from Prices
group by Date,date_add(Date, INTERVAL 1 DAY),pkdummy,pkey, Symbol having right(pkdummy,2)=22)sq
join Prices newP on newP.Date=sq.Date and newP.Symbol=sq.Symbol
where right(newP.pkdummy,2)=22 and sq.Date > '2018-11-22' order by datetime desc;
#Use other two views to calculate target
create view priceTarget as
select pv1.Date, pv1.Symbol, avg(pv1.Price) as 'Initial Price', avg(pv2.NewPrice) as 'Price24hLater',
avg(((pv2.NewPrice-pv1.Price)/pv1.Price)*100) as 'Target24hChange',
avg(((pv2.NewBTCdominance-pv1.BTC_Dominance)/pv1.BTC_Dominance)*100) as 'BTCdominance24hChange',
pv1.pkey from PricesView1 pv1
join PricesView2 pv2 on pv1.Date=pv2.oldDate and pv1.Symbol=pv2.Symbol
group by pv1.Date, pv1.Symbol;
关于如何通过避免使用连接的更快查询获得相同结果的任何想法?
非常感谢任何帮助!
编辑:我想这只是归结为我只是加载了大量数据这一事实。我创建了一个新的第一个 View 来提前过滤我的数据,并将加载时间从大约 32 秒减少到略高于 10 秒。感谢那些提供帮助的人!