Agrupación de Datos Geográficos por Ciudades en SQL
Resumen
¿Cómo trabajar con datos geográficos en bases de datos?
El manejo de datos geográficos se ha convertido en una parte crucial de la administración y análisis de datos, especialmente considerando su aplicación en mapas y análisis espaciales. Al organizar y visualizar información sobre localidades como ciudades y países, estas bases de datos ofrecen un contexto invaluable para una amplia gama de aplicaciones. En este artículo, exploraremos cómo estructurar y abordar estos conjuntos de datos, proporcionando una base fundamental para presentaciones visuales atractivas y útiles.
¿Qué formas pueden tomar los datos geográficos?
Los datos geográficos pueden presentarse de varias maneras, cada una con sus propias ventajas y aplicaciones específicas:
Coordenadas geográficas: La combinación de latitud y longitud permite ubicar puntos exactos en el espacio, lo cual es fundamental para aplicaciones cartográficas precisas.
Códigos de país y ciudad: Utilizados para identificar de manera única un país o ciudad, estos códigos simplifican la organización de grandes cantidades de datos geoespaciales.
Nombres de lugares: A menudo se emplean para mapas y visualizaciones generales debido a su facilidad de uso y familiaridad.
¿Cómo agrupar datos por ciudades?
Para analizar y presentar datos sobre un mapa de manera efectiva, es pertinente primero agrupar los datos por localizaciones específicas como las ciudades. Un buen ejemplo es agrupar rentas por ciudad para así visualizarlas en proyectos futuros.
Ejemplo de consulta en SQL
Usaremos SQL para agrupar datos de rentas por ciudad a partir de varias tablas relacionadas:
SELECT ciudades.nombre_ciudad,COUNT(*)AS total_rentas
FROM ciudades
INNERJOIN direcciones ON ciudades.id_ciudad = direcciones.id_ciudad
INNERJOIN tiendas ON direcciones.id_direccion = tiendas.id_direccion
INNERJOIN inventarios ON tiendas.id_tienda = inventarios.id_tienda
INNERJOIN rentas ON inventarios.id_inventario = rentas.id_inventario
GROUPBY ciudades.id_ciudad;
Este fragmento de código representa una consulta típica para obtener el total de rentas por ciudad. A través del uso de varias uniones internas, relacionamos tablas clave que contienen información sobre ciudades, direcciones, tiendas, inventarios y rentas.
¿Cómo optimizar la visualización de los datos?
Para transformar estos datos en visualizaciones útiles, por ejemplo, mapas:
Mapeo con intensidad: Se pueden crear mapas donde las regiones con más datos (como más rentas) se muestren en colores más oscuros. Esto ayuda a visualizar la densidad de las rentas fácilmente.
Integración en sistemas SIG: Sistemas de Información Geográfica (SIG) pueden tomar estas agrupaciones y transformar los datos en mapas complejos, ofreciendo más contexto y análisis espacial.
Este enfoque sistemático no solo facilita el manejo de datos geográficos, sino que también potencia las decisiones basadas en datos dentro de una gran variedad de campos, desde la planificación urbana hasta la gestión de recursos. Y así, te animamos a continuar explorando el fascinante mundo del análisis y visualización de datos geográficos.
Esperaba más extensa la explicación de este tema, postgreSQL permite realizar operaciones con datos geográficos de foram más avanzada :/
En estricto rigor, en esta clase no se trabajó con datos geográficos, sino más bien, con una suma de joins que relacionaban el campo ciudad con las demás variables. Pero el campo ciudad no es más que una variable de texto más.
Totalmente de acuerdo
Así es!
realmente no hablo de datos geograficos como tal, pero si necesitan mas informacion busquen PostGis
PostGIS es software libre y es compatible con los estándares de Open Geospatial Consortium (OGC)
Permite el acceso de usuarios simultáneos
Funciones espaciales mediante SQL y trabajar con topología
PostGIS incluye un visor de geometrías integrado en pgAdmin 4
Permite trabajar con triggers
Enrutamiento
Tipos de geometría
Es rápido y seguro
Sencilla importación y exportación de datos
Existen decenas de aplicaciones que trabajan bien con PostGIS
Esta clase no es más que un select con varios joins, esperaba algo nuevo :(
jajaja sí...
Para los que preguntan por que tan pocas ciudades es probable que la version del Israel en ese momento solo contara con esas ciudades, si lo haces actualmente muestra 4 ciudades, pero igual parecen pocas así que es posible que no cumplan con los joins es decir que si usas FULL OUTER JOIN puedes encontrar las demás.
INNER JOIN:
FULL OUTER JOIN:
precisamente me estaba haciendo esa pregunta
Quedé con duda al respecto de tu Query y me dí cuenta que está mal usar el full outer join ya que te está trayendo todas las ciudades incluso en las que no hubo ventas, a la final el primer Query está bn ya que en estas 4 ciudades son en las únicas que hubo ventas al respecto
Saludos !
ok, esperaba algo de coordenadas geográficas
Sería bueno, contar con un curso específico de PostGis, es una extensión bastante potente y que ayuda bastante contar y analizar la espacialidad de nuestra base de datos. Saludos.-
select ciudades.ciudad_id, ciudades.ciudad,count(*)as renta_por_ciudad
from ciudades
inner join direcciones on ciudades.ciudad_id= direcciones.ciudad_id inner join tiendas on tiendas.direccion_id= direcciones.direccion_id inner join inventarios on inventarios.tienda_id= tiendas.tienda_id inner join rentas on inventarios.inventario_id= rentas.inventario_idgroup by ciudades.ciudad_id;
Interesante, sólo me quedó la duda con los datos del select versus el group by, ya que si tiene en el select 2 campos (ciudades_id y ciudad) , estos dos deben estar en el group by y solo veo uno (ciudad_id).
quizas sea una caracteristica de PgAdmin, yo uso DBeaver.
Hola, al ser ciudades_id un campo único que no se repite no es necesario colocar la ciudad como agrupación ya que para cada ciudad corresponde un id único. No sé si me hize entender, saludos.
GROUP BY toma un conjunto (o varios) completo, como una especie de FULL OUTER JOIN a nivel interno con redundancia o irrelevancia de información innecesaria para este caso concreto.
INNER JOIN en cambio toma sólo la intersección de los conjuntos, es por eso que se obtiene sólo el elemento que tienen en común entre sí. Es únicamente ese criterio o campo en común lo que particularmente nos interesa en este caso para relacionarlas "comunicándolas" entre sí.
Donde está lo "geográfico"? Con sólo la ciudad no se puede pintar en un mapa
SELECT ciudades.ciudad_id, ciudades.ciudad,COUNT(*)AS rentas_por_ciudad
FROM ciudades
INNERJOIN direcciones ON ciudades.ciudad_id= direcciones.ciudad_idINNERJOIN tiendas ON tiendas.direccion_id= direcciones.direccion_idINNERJOIN inventarios ON inventarios.tienda_id= tiendas.tienda_idINNERJOIN rentas ON inventarios.inventario_id= rentas.inventario_idGROUPBY ciudades.ciudad_id;
Cuál es un dato geográfico válido por si mismo?
Porque la salida muestra solo 2 ciudades? Si el propósito de la query es encontrar las rentas por ciudad, deberían aparecer todas las ciudades.
Probablemente la version del Israel en ese momento solo mostraba con esas ciudades, si lo haces actualmente muestra 4 ciudades, pero al igual parecen pocas así que es posible que no cumplan con los joins es decir que si usas FULL OUTER JOIN puedes encontrar las demás.
INNER JOIN:
FULL OUTER JOIN:
Coincido con la respuesta de Jav24
¿Qué es PostgreSQL y PostGIS?
PostGIS es un software compatible con Open Geospatial Consortium (OGC) utilizado como un extensión para PostgreSQL, que es una forma de base de datos objeto-relacional. ... El lenguaje de PostGIS es similar al SQL y permite realizar análisis espaciales y consultas típicas sobre datos espaciales con relativa facilidad.
Introducción a PostGIS
Amigo tu link esta caido
Es la unica clase que me ha descepcionado.
Esperaba una explicación de como trabajar con campos de latitud y longitud.
Tengo una duda, si el total de 16044, el resultado de la suma de las rentas por ciudad no debería ser el mismo? o estoy interpretando mal el query?
Tenia la misma duda, yo hice la query de la siguiente manera:
select ciudad,count(*)as total_rentas
from ciudades
inner join direcciones using(ciudad_id) inner join clientes using(direccion_id) inner join rentas using(cliente_id) group by ciudad
order by total_rentas desc;
Luego introduje esta query como subquery para poder sumar el total de rentas por ciudad y me dio 16044:
select sum(b.total_rentas)from( select ciudad,count(*)as total_rentas
from ciudades
inner join direcciones using(ciudad_id) inner join clientes using(direccion_id) inner join rentas using(cliente_id) group by ciudad
order by total_rentas desc)as b;
Me parece que está seria la forma correcta de resolver el ejercicio..
efectivamente tienes razón, el resultado total debería ser 16044 que es la cantidad de rentas, sin embargo el valor que esta arrojando es por los inventarios, hay inventarios que tienen 4 rentas o menos por el resultado disminuye, al usar el JOIN inventarios eso sucede.
30. Ordenando datos geográficos
SELECT ciudades.ciudad_id, ciudades.ciudad,COUNT(*)AS rentas_por_ciudad
FROM ciudades
INNERJOIN direcciones ON ciudades.ciudad_id = direcciones.ciudad_id
INNERJOIN tiendas ON tiendas.direccion_id = direcciones.direccion_id
INNERJOIN inventarios ON inventarios.tienda_id = tiendas.tienda_id
INNERJOIN rentas ON inventarios.inventario_id = rentas.inventario_id
GROUPBY ciudades.ciudad_id;
Es errado equiparar los tipos de datos geográficos a topónimos, como nombres de ciudades. Resultaría más acorde hablar de las 3 geometrías básicas que podrían usarse para representar datos geográficos: puntos, líneas o polígonos.