que tienen la siguiente tabla de base de datos con información sobre las personas, las enfermedades y las drogas:¿Cómo traduzco una declaración booleana simple a SQL?
PERSON_T DISEASE_T DRUG_T
========= ========== ========
PERSON_ID DISEASE_ID DRUG_ID
GENDER PERSON_ID PERSON_ID
NAME DISEASE_START_DATE DRUG_START_DATE
DISEASE_END_DATE DRUG_END_DATE
A partir de estas tablas, corro algunas estadísticas acerca de qué individuos han tomado medicamentos que y tenían qué enfermedades. De esto puedo deducir qué patrones son interesantes para profundizar en el . Por ejemplo, a continuación es un ejemplo simplificado del patrón booleano que podría encontrar para la enfermedad 52:
((Drug 234 = false AND Drug 474 = true AND Drug 26 = false) OR
(Drug 395 = false AND Drug 791 = false AND Drug 371 = true))
Editar: He aquí otro ejemplo:
((Drug 234 = true AND Drug 474 = true AND Drug 26 = false) OR
(Drug 395 = false AND Drug 791 = false AND Drug 371 = true))
Ahora quiero convertir este patrón en una consulta SQL y encuentre a todas las personas que coinciden con este patrón.
Por ejemplo, quiero encontrar todas las personas en PERSON_T que tuvieron la enfermedad y ((que no tomaron el medicamento 234 y 26 antes de presentar síntomas, pero sí tomaron el medicamento 474 antes de presentar los síntomas) o (que tomaron el medicamento 371 antes de presentar síntomas, pero no el medicamento 791 y 395 antes de presentar síntomas))
¿Cómo podría volver a traducir este patrón en la consulta original?
Aquí es mi primer intento, pero se queda bloqueado en el primer plazo:
SELECT * FROM PERSON_T, DRUG_T, DISEASE_T
WHERE DISEASE_ID = 52 AND
PERSON_T.PERSON_ID = DISEASE_T.PERSON_ID AND
PERSON_T.PERSON_ID = DRUG_T.PERSON_ID AND
(DRUG_T.DRUG_ID=234 AND (DRUG_T.DRUG_START_DATE>DISEASE_T.END_DATE || ???)
necesito que esto funcione en PostgreSQL, pero supongo que cualquier respuesta dada puede ser traducido de una base de datos dada a PostgreSQL.
Respuesta a los comentarios
- que fija el formato de base de datos tablas. Gracias.
- Necesito poder tomar una declaración booleana arbitraria y traducirla a SQL. Las declaraciones booleanas que en realidad estamos creando son mucho más extensas que el ejemplo que di. Cualquier tabla nueva que cree estará en una nueva base de datos y necesita tener el mismo esquema que las tablas originales. De esta forma para el usuario final, puede ejecutar su mismo código en las nuevas tablas y funciona igual que si se ejecutara en las tablas originales. Este es un requisito del cliente. Espero poder crear una vista que sea solo una consulta a las tablas originales. Si no podemos lograr que funcione, puedo crear una copia de las tablas y filtrar los datos mientras los copio en la nueva tabla. No estamos usando redes neuronales para hacer el análisis. Estamos utilizando nuestros propios algoritmos personalizados que escalan mucho mejor que las redes neuronales.
- La Disease_Start_Date es la fecha en la que la persona obtiene los síntomas, lo que es probable cuando comienzan a aparecer los síntomas. Disease_End_Date es cuando la persona se recupera, lo que es probable cuando los síntomas desaparecen.
- Drug_start_date es cuando la persona comienza a tomar los medicamentos. Drug_end_date es cuando la persona deja de tomar las drogas.
Editar he añadido mi propia respuesta. ¿Alguien puede encontrar una respuesta más simple?
creo que sus defs de mesa tienen un formato incorrecto. ¿ENFERMEDAD_END_DATE debe estar en la tabla Person o en la tabla Disease? Creo que el espaciado se estropeó. Además, debido a eso, el DRUG_END_DATE aparece en la tabla de Enfermedades. – MJB
¿Está interesado solo en esa combinación particular de drogas o habrá otras?Si hay más combinaciones en lugar de hacer de esto una consulta SQL estática, recomendaría hacer otras tablas que contengan los patrones de medicamentos que busca y generar una consulta SQL dinámica para hacer referencia a su tabla de restricciones. Esto escalará mejor con sus requerimientos futuros y le ahorrará tiempo de hacer diferentes consultas cada vez que cambie las "drogas de interés". Este tipo de análisis también me grita "red neuronal": encontrar un patrón no lineal entre los datos caóticos. –
No se mencionan los síntomas en ninguna de las tablas. ¿Debemos suponer que las tablas solo registran datos antes de que se exhiban los síntomas? ¿Los síntomas se registran como enfermedades separadas en la tabla de enfermedades? ¿O los síntomas son irrelevantes para la consulta en cuestión? –