Closed. This question is off-topic。它目前不接受答案。
想改进这个问题吗?Update the question所以堆栈溢出的值小于aa>。
12个月前关闭。
我在SQL中有一个使用join的视图,它花费的时间比我希望的要长得多。我想如果我把它转换成一个子查询,它会运行得更快,但是我遇到了麻烦。
基本上,我想创建一个“target”列来计算资产价格24小时变化率。现在,我要做的是创建第一个视图,它是普通表,然后创建第二个视图,它是第一个表的副本,但日期是+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;

on-topic
关于如何通过避免使用连接的快速查询获得相同的结果,有什么想法吗?
任何帮助都将不胜感激!
编辑:我想是因为我有很多数据要加载。我创建了一个新的第一个视图来提前过滤我的数据,这将加载时间从大约32秒减少到刚刚超过10秒。感谢那些帮忙的人!

最佳答案

在创建PriceView2时,似乎有一些不必要的代码
与末尾的order by类似,您计算价格和BTC,但不在priceTarget视图中使用它们(您使用PriceView1中已经可用的值)。我认为你把它放在那里是为了有唯一的日期/符号,你可以使用一个select DISTINCT来实现相同的结果。
我不知道这是不是有意的,但是BTC和价格是根据PricesView1中的平均值计算的,而不是PricesView2中的平均值。
这是我对价格的建议视图2:

create view PricesView2 as
select
    sq.Date,
    newP.Date,
    sq.Symbol,
    newP.Price as 'NewPrice',
    newP.BTC_Dominance as 'NewBTCdominance',
    newP.pkdummy
from (
        select distinct
            Date as 'oldDate',
            Symbol,
            pkdummy,
            pkey
        from Prices
        having right(pkdummy,2)=22) sq
    join Prices newP on
        newP.Date=date_add(sq.oldDate, INTERVAL 1 DAY)
        and newP.Symbol=sq.Symbol
where right(newP.pkdummy,2)=22
and   sq.Date > '2018-11-22'

我对视图的理解是,它们可以与其他语言中的宏进行比较:更像是代码替换,而不是预计算。
所以当你在priceTarget avg(pv1.Price)中这么做的时候,考虑到pv1.Price被定义为avg(Price),你就是平均值。
除了我上面建议的更改之外,我还将更改PricesView2以计算新价格和BTC平均值,这样priceTarget视图就不必
最后在priceTarget视图中,除了pv1.Date和pv1.symbol之外,还应该按pv1.pkey分组。

关于mysql - SQL用更快的速度替换联接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53756799/

10-10 06:41