SQL Server - Análisis léxico sobre primera ocurrencia en sql.

 
Vista:

Análisis léxico sobre primera ocurrencia en sql.

Publicado por Gonzalo (1 intervención) el 04/05/2012 19:56:38
--Buenos días!
--Se tiene las siguientes estructura para el almacenamiento de registro de incidentes delictivos:
CREATE TABLE incidentes(
[fecha] date,
[hora] time,
[delito] nvarchar(255), --tipo de delito ej. Robo de vehículo
[detalle] nvarchar(255), --no relevante en este punto
[descripción] nvarchar(Max), --todo lo especificado en la denuncia.
[municipio] nvarchar(255),
[población] nvarchar(255),
[colonia] nvarchar(255)
)
go
--Lo deseado es establecer las marcas más robadas y la cantidad de ellas por
sector (colonia), las marcas han sido guardadas en la siguiente
estructura.
CREATE TABLE marcasVehiculos (
[nombre] nvarchar(255)
)
go
--La idea era usar likes con left outer joins, pero el problema que estoy
trabajando con registros existentes y capturados al bravazo (por así
decir): en descripción se tiene a quien se le robó, las placas, la marca
y detalles de los asaltantes. Por ejemplo:
Fecha: 2011-10-05
Hora: 17:23:00
Delito: ROBO VIOLENTO DE VEHÍCULO
Detalle: DE SERVICIO PARTICULAR
Descripción:
ROBO VIOELNTO DE VEHÍCULO, ES UN NISSAN TSURU, COLOR GRIS, MODELO 2009,
SE DESCONOCEN PLACAS DE CIRCULACIÓN, A NOMBRE DE CADENA COMERCIA OXXO,
RESPONSABLES A LA FUGA A BORDO DE UNA HONDA CR-V, COLOR BLANCO. CULIACAN
CULIACAN DE ROSALES INFONAVIT HUMAYA

El algoritmo utilizado fue el siguiente:
Si POR representa la marca a buscar entonces con un like '*POR*'
( donde * es comodín) se contaría a todas las coincidencias. Sin
embargo en el caso donde también se establezca el vehículo del
delincuente este también es contado.
Entonces si el vehículo del delincuente es Y, y . se presentan los siguientes casos.
a) '*X*'. Solo se presenta una marca.
b) '*X*X*'. Se presenta el caso de un vehículo robado por otro de la misma marca.
c) '*X*Y*'. Se presenta el robo de un vehículo por otro de diferente marca.
d) '*Y*X*'. El vehículo del delincuente es el de la marca a contar.
La condición elaborada fue la siguiente:
Not
d) AND X<>Y
OR
not b) --debido a que b) incluye a a) en like.
or
not a) --para aquellos que no fueron categorizados.

En fin no creo que sea muy claro así que incluyo la consulta con la que intento realizarlo, pero no logra funcionar correctamente.

select
distinct iC.municipio,iC.poblacion ,iC.colonia,mV.nombre as Marca,
count(case when hora between '00:00:00' and '01:59:00' then 1 end) as [00:00 - 01:59],
count(case when hora between '02:00:00' and '03:59:00' then 1 end) as [02:00 - 03:59],
count(case when hora between '04:00:00' and '05:59:00' then 1 end) as [04:00 - 05:59],
count(case when hora between '06:00:00' and '07:59:00' then 1 end) as [06:00 - 07:59],
count(case when hora between '08:00:00' and '09:59:00' then 1 end) as [08:00 - 09:59],
count(case when hora between '10:00:00' and '11:59:00' then 1 end) as [10:00 - 11:59],
count(case when hora between '12:00:00' and '13:59:00' then 1 end) as [12:00 - 13:59],
count(case when hora between '14:00:00' and '15:59:00' then 1 end) as [14:00 - 15:59],
count(case when hora between '16:00:00' and '17:59:00' then 1 end) as [16:00 - 17:59],
count(case when hora between '18:00:00' and '19:59:00' then 1 end) as [18:00 - 19:59],
count(case when hora between '20:00:00' and '21:59:00' then 1 end) as [20:00 - 21:59],
count(case when hora between '22:00:00' and '23:59:00' then 1 end) as [22:00 - 23:59],
count(*) as [Total de Robos]
from incDel as iC
left outer join marcasVehiculos X
on iC.descripcion like '%'+mV.nombre+'%'
left outer join marcasVehiculos Y
on mV.nombre = mV2.nombre--iC.descripcion like '%'+mV.nombre+'%'
where
year(fecha) = 2010--@año
and delito like '%de vehiculo%'
and
(
(iC.descripcion not like '%'+Y.nombre+ '%'+X.nombre+'%' and Y.nombre <> X.nombre)
or
(iC.descripcion like '%'+X.nombre+ '%'+X.nombre+'%')
or X.nombre is null
)
group by iC.municipio, iC.poblacion,iC.colonia ,mV.nombre
order by [Total de Robos] desc, Colonia

La cosa es que tiene cuando mucho de 80% a 85% de precision, donde son 400 robos marca 460, donde son 10 marca entre 8 y 12... y así. Además de ser muy lento po la cantidad de analisis léxicos. Si existe una mejor solución u otra manera de hacer por favor se les agradecería mucho! Cualquier idea es bien recibida.
Como dato extra no se permite hacer aproximaciones por muestreo, se deasean lo más exacto posible por colonia por lo que no da lugar a mucho. Sé que corregir la base de datos es la mejor opcion pero como no me pertence deja de ser una opcion. Hacerlo manualmente tampoco debido a la entrada constante de datos. Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Análisis léxico sobre primera ocurrencia en sql.

Publicado por Isaias (4558 intervenciones) el 05/05/2012 00:25:14
Creo que es una mision para Rambo, Superman, Batman y Robin.......no veo por donde puedas atacar tu problema.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar