Eu tenho duas tabelas assim:
Table Experiment (vou usar apenas um roadID (rID) por enquanto)
rID | latBegin |longBegin |latEnd |longEnd
041 | 23.875464|-80.456798|30.549879|-83.5465521
041 | 33.776563|-81.157526|33.248261|-81.2468425
Para cada uma das linhas acima, quero que o cursor obtenha o rID, latBegin, longBegin e verifique a distância do lat e do long em
Table ExperimentDetails
rID | lat |long |temp |direction|tension
041 | 33.665632|-81.137952|56.23|L |54.54
041 | 23.245632|-80.127952|56.23|L |23.54
041 | 23.454555|-80.232456|66.23|L |13.54
041 | 23.568763|-80.346586|26.23|L |63.54
041 | 23.796545|-80.446586|86.23|L |83.54
041 | 23.996545|-80.946586|96.23|L |22.54
As etapas para a consulta são:
Etapa 1: Obtenha latBegin e longBegin para um rID específico da Tabela Experimento
Etapa 2: Vá para ExperimentDetails e execute este cálculo para obter a diferença de distância para cada lat e long na tabela Details
Round(Sqrt(POWER((Abs(lat - @latBegin)),2) + POWER((Abs(long - @longBegin)),2)) * 3958.73926185, 4) * 1000
Etapa 3: obter o valor mínimo para esta nova coluna associada na tabela de detalhes
Etapa 4: obter os valores associados de temperatura, direção e tensão para esse valor mínimo e colocá-lo em uma nova tabela (ainda não concluída> ajuda necessária)
Etapa 5: Obtenha a média de temp, tensão para os 30 pés ou 360 polegadas anteriores do valor mínimo e coloque-o em outra tabela (colunas: rID, latBegin,longBegin,avgTension,avgtemp Ainda não concluído>Ajuda necessária)
Este é o meu código até agora:
DECLARE @rID int,@latBegin decimal(15,10),@longBegin decimal(15,10),@minV decimal(15,10),@temp decimal(15,10)
DECLARE MY_CURSOR CURSOR
LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR
SELECT DISTINCT rid,latbeg,longbeg
FROM dbo.Experiment
WHERE rID='041'
OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR INTO @rID,@latBegin,@longBegin
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @minV=Min(Round(Sqrt(POWER((Abs(lat - @latBegin)),2) + POWER((Abs(long - @longBegin)),2)) * 3958.73926185, 4) * 1000,latitude) over (Partition by rID Order by rID)
, @temp=temp
FROM dbo.ExperimentDetails
WHERE rid='041'
Insert into dbo.Test(rid,lat,lon,min,temp) values (@rid,@latBegin,@longBegin,@minV,@temp)
FETCH NEXT FROM MY_CURSOR INTO @rID,@latBegin,@longBegin
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
A tabela de teste fica assim:
rID|lat |long |min |temp
041|23.875464|-80.456798|12.1|96.23
041|33.776563|-81.157526|11.0|96.23
Os dados temporários são repetidos para a última linha, o que não está correto
Deve ficar assim:
rID|lat |long |min |temp
041|23.875464|-80.456798|12.1|83.54
041|33.776563|-81.157526|11.0|54.54
Eu dei o máximo de informações que pude, mas se você precisar de mais, pergunte, agradeço qualquer ajuda, estou batendo minha cabeça nisso desde ontem. Atualmente estou tentando trazer temp, direção e tensão além de @minV, mas não me deixa fazer isso
Para a Etapa 5: O cálculo no cursor se parece com isso em teoria para a tabela Detalhes:
rID |lat |long |temp |DISTDIFF
041 | 23.245632|-80.127952|56.23|372.12
041 | 23.454555|-80.232456|66.23|300.22
041 | 23.568763|-80.346586|26.23|50.48
041 | 23.796545|-80.446586|86.23|12.10
Então ao inserir eu verifico o valor mínimo ou seja 12,10 e insiro os valores associados a essa linha.
Para a etapa 5, preciso encontrar o valor mais próximo de 360 ANTES do valor mínimo não depois (pode haver outros valores mais próximos depois), que nesse caso é 372,12 e depois tirar a média de temp assim:
rID |minlat |minlong |lastlat |lastlong |Avgtemp
041 | 23.796545|-80.446586|23.245632|-80.127952|58.73
Usando Sql Server 2014
Acho que tenho uma solução para você... mas!!! IMPORTANTE: Você não está considerando ter mais de 1 registro em DETAIL que seja igual ao Valor Min... Você também está faltando a coluna TENSION na tabela TEST
De qualquer forma, para responder à sua pergunta, tente substituir isso:
Com isso:
Boa sorte!
---PARA ETAPA 5 -----
Em primeiro lugar, vou assumir que você já criou a outra tabela, digamos: Temp360
Então, inclua outras 2 variáveis na zona DECLARE... digamos: @min360 decimal(15,10) e @avgtemp decimal(15,10)
então use este código dentro do seu loop de cursor: