Eu tenho uma tabela de valores X e Y relacionados a pontos em uma grade de mapeamento onde cada par de valores faz referência ao canto inferior esquerdo de cada quadrado que é espaçado em incrementos de 500 metros quadrados para cada valor para formar os pontos em uma estrutura de grade.
Aqui está um exemplo da tabela com alguns dados semelhantes com o XY_ID sendo apenas uma concatenação dos valores X e Y.
XY_GridPointID | X_GridPoint | Y_GridPoint |
---|---|---|
250000650000 | 250000 | 650000 |
250500650500 | 250500 | 650500 |
251000651000 | 251000 | 651000 |
251500651500 | 251500 | 651500 |
252000652000 | 252000 | 652000 |
252500652500 | 252500 | 652500 |
253000653000 | 253000 | 653000 |
253500653500 | 253500 | 653500 |
254000654000 | 254000 | 654000 |
254500654500 | 254500 | 654500 |
255000655000 | 255000 | 655000 |
Em seguida, tenho outra tabela com cada linha tendo um valor específico de X e Y, que é mais específico em termos de valores reduzidos ao medidor. Assim, por exemplo, uma determinada linha tem um X_Value de 252996 e um Y_Value de 652818.
O que eu gostaria de conseguir é ser capaz de pesquisar a tabela de grade mostrada acima e extrair X_GridPoint e Y_GridPoint de onde X_Value e Y_Value dessa linha específica estão dentro em termos de incrementos de 500 m.
Portanto, para X_Value de 252996 e Y_Value de 652818, isso localizaria X_GridPoint de 252500 e Y_GridPoint de 652500, que é a linha 6 da tabela de exemplo acima. Os Valores estarão essencialmente 'recuando' em qualquer ponto de grade de 500m que precede esse valor e nunca será 'arredondado' para o próximo ponto de grade de 500m.
A tabela com os pontos da grade consistirá em cerca de 25.000 linhas dessas combinações e procurando vincular a um grande conjunto de dados com os valores X e Y específicos, então gostaria de saber se alguém pode sugerir a melhor maneira de abordar isso e o que funcionaria melhor em termos de desempenho. Qualquer ideia seria muito apreciada.
Usando o SQLServer 2016
Você essencialmente deseja dividir ambos
X_Value
eY_Value
por 500, truncar os resultados, multiplicá-los novamente por 500 e corresponder os valores resultantes contraX_GridPoint
eY_GridPoint
de acordo.Se
X_Value
eY_Value
forem do tipo inteiro (int
,bigint
...), a expressão necessária seria tão simples quantoonde o truncamento seria feito automaticamente, pois
/
realiza a divisão inteira quando ambos os operandos forem inteiros.Se os valores de entrada forem de um tipo diferente (
float
,numeric
...), será necessária uma etapa extra:Se tudo o que você deseja são as coordenadas, não precisa realmente consultar a tabela. A fórmula, aplicada a ambos
X_Value
eY_Value
, forneceria os X e Y do canto inferior esquerdo do quadrado procurado:No entanto, se as linhas da tabela real contiverem mais do que apenas as coordenadas e você precisar obter esses dados, veja como a consulta de pesquisa pode parecer: