2017-07-25 7 views
0

Ich möchte fragen, wie eine Spalte mit der tickerID ausgeben.Ausgabespalte für komplexe Abfrage

Ab jetzt habe ich folgendes:

select distinct 
    mtime, 
    avg(lastBid) Bid , 
    avg(lastAsk) Ask 
from 
    (Select 
     a.mtime, a.IntradayTime, f.lastBid, f.lastAsk 
    from 
     (select 
       cte.*, 
       (select top 1 datetime 
       from IntradayHistory_1min.dbo.IntradayDataHistory' + @product + '_1min' + ' 
       where datetime <= cte.mtime 
       and TickerID = ' + cast(@ticker as nvarchar(24)) + ' 
       order by datetime desc) as IntradayTime 
      from 
       cte) a 
    left join 
     Intradayhistory_1min.dbo.IntradayDataHistory'+ @product + '_1min' + ' f on f.datetime = a.IntradayTime and f.tickerid = ' + cast(@ticker as nvarchar(24)) + ') b 
group by 
    mtime 
order by 
    mtime 
option (maxrecursion 0) 

Ein Screenshot von dbo.IntradayDataHistory_Rebar_1min (in diesem Fall: Rebar ist @product):

enter image description here

Aktualisiert zur Klarstellung: Output so aussehen,

enter image description here

Auch ich habe folgendes versucht, das hat nicht funktioniert:

select distinct mtime, 
(ticker) tickerid 
avg(lastBid) Bid , 
avg(lastAsk) Ask 

from (Select a.mtime, a.IntradayTime, f.tickerid, f.lastBid, f.lastAsk 
from (select cte.*, (select top 1 datetime from IntradayHistory_1min.dbo.IntradayDataHistory' + @product + '_1min' + ' 
where datetime <= cte.mtime and TickerID = ' + cast(@ticker as nvarchar(24)) + ' order by datetime desc) as IntradayTime from cte) a 
left join Intradayhistory_1min.dbo.IntradayDataHistory'+ @product + '_1min' + ' f 

on f.datetime = a.IntradayTime and f.tickerid = ' + cast(@ticker as nvarchar(24)) + ') b 
group by mtime order by mtime option (maxrecursion 0) 

Der Fehler erhalte ich:

Spalte ‚b.tickerid‘ ist ungültig in der Auswahlliste, weil es weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten.

+0

Was genau meinen Sie mit 'eine Spalte ausgeben '? –

+0

Unklar, was Sie zu tun versuchen - aber wir können sehen, dass logisch, das 'Tickerid' auch das sein muss, was in der Variable' @RBticker1' enthalten ist, der einfachste Ansatz könnte sein, das auszuwählen. –

+0

Und wenn Sie 'Tickerid' zur GROUP BY-Klausel hinzufügen? 'gruppieren nach mtime, tickerid order by ...' –

Antwort

0

fand ich die Lösung aus, um tatsächlich eine Funktion avg vor Ticker hinzufügen, so wie folgt:

select distinct mtime, 
avg(ticker) tickerid 
avg(lastBid) Bid , 
avg(lastAsk) Ask 

from (Select a.mtime, a.IntradayTime, f.tickerid, f.lastBid, f.lastAsk 
from (select cte.*, (select top 1 datetime from IntradayHistory_1min.dbo.IntradayDataHistory' + @product + '_1min' + ' 
where datetime <= cte.mtime and TickerID = ' + cast(@ticker as nvarchar(24)) + ' order by datetime desc) as IntradayTime from cte) a 
left join Intradayhistory_1min.dbo.IntradayDataHistory'+ @product + '_1min' + ' f 

on f.datetime = a.IntradayTime and f.tickerid = ' + cast(@ticker as nvarchar(24)) + ') b 
group by mtime order by mtime option (maxrecursion 0) 

Der Grund ist hier in: Column "invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause"

+0

Sie haben in Ihrer Frage nicht angegeben, dass Sie einen Durchschnitt in Ihrem Ticker brauchen, vielleicht suchen Sie nach etwas anderem? Was nützt es, einen Durchschnitt einer ID zu nehmen? – Hatik