none
Consulta en tablas no relacionadas, SQLServer RRS feed

  • Pregunta

  • Buenas!

    Verán tengo un ejercicio en el cual me piden rellenar una nueva tabla con datos de otra según una fecha(de otra tabla). El caso es que esa tabla no está relacionada con ninguna de la propia BDD y la verdad nose como hacerlo. Seguramente sea una "tonteria" pero se me está pasando por alto seguro. Les dejo el enunciado y las tablas por si les facilita la comprension.

    Enunciado: 

    La Policía nos envía una tabla en la que figura el momento en el que fue detectado el terrorista por alguna de las cámaras y el grado de fiabilidad de esa detección. El grado de fiabilidad es un número real entre 0.5 y 1, y representa la probabilidad estimada de que la detección sea correcta. Para ser buena, una detección tiene que tener un valor superior a 0.85. Si está entre 0.85 y 0.70 se considera media, y si es inferior a 0.7 es una detección mala. Se ha añadido un ID a la tabla para facilitar el trabajo y para cumplir la primera restricción inherente al modelo relacional, que para eso somos gente seria y profesional.

    Nos piden que identifiquemos quiénes eran los usuarios del metro que estaban dentro del sistema en esos momentos que nos dan y generemos una tabla en la que almacenaremos los IDs, nombre, apellidos, número de identificaciones positivas, número de identificaciones positivas buenas y valor medio de la fiabilidad de las identificaciones.

    Tablas:

    La base de datos es una que representa "el metro", viajes, itinerario, pasajeros...

    -- Datos proporcionados por la policia, la cual no está relacionada con nada de la BDD
    INSERT INTO Detecciones (Momento,Fiabilidad)
        VALUES (SmallDateTimeFromParts(2017,2,24,17,03),0.84), (SmallDateTimeFromParts(2017,2,24,19,20),0.77),
    (SmallDateTimeFromParts(2017,2,24,20,16),0.92), (SmallDateTimeFromParts(2017,2,24,23,41),0.64),
    (SmallDateTimeFromParts(2017,2,25,7,4),0.61), (SmallDateTimeFromParts(2017,2,25,8,2),0.58),
    (SmallDateTimeFromParts(2017,2,25,13,35),0.88), (SmallDateTimeFromParts(2017,2,25,13,58),0.72),
    (SmallDateTimeFromParts(2017,2,25,18,56),0.96), (SmallDateTimeFromParts(2017,2,25,19,3),0.68),
    (SmallDateTimeFromParts(2017,2,25,22,16),0.86), (SmallDateTimeFromParts(2017,2,25,22,24),0.71),
    (SmallDateTimeFromParts(2017,2,26,0,14),0.62), (SmallDateTimeFromParts(2017,2,26,0,21),0.87),
    (SmallDateTimeFromParts(2017,2,26,10,47),0.78), (SmallDateTimeFromParts(2017,2,26,14,3),0.54)
    GO

    -- Esta es la tabla que debe rellenarse con los datos calculados
    CREATE TABLE Sospechosos (
    ID Int Not NULL,
    Nombre VarChar (20) Not NULL,
    Apellidos VarChar(30) Not NULL,
    IdentificacionesPositivas TinyInt Not NULL,
    IdentificacionesBuenas TinyInt Not NULL,
    FiabilidadMedia Float,
    Constraint CKBuenasMenor Check(IdentificacionesBuenas<=IdentificacionesPositivas),
    Constraint CKFiabilidadO1 Check (FiabilidadMedia Between 0 AND 1)
    )

    Si necesitaran alguna otra cosa me avisan. Muchas Gracias de antemano!!

    sábado, 21 de marzo de 2020 10:04

Todas las respuestas

  • Es algo muy sencillo

    Deberias hacer algo como

    INSERT INTO [NombreBaseDeDatos].[dbo].Sospechosos (Nombre, Apellido)

    SELECT Nombre, Apellido
    FROM [NombreBaseDeDatos].[dbo].[NombreTabla]
    WHERE (aca pones los filtros, en tu casa por lo que entendi son un rango de fechas)

    ----------------------

    Basicamente en el  INSERT INTO pones el nombre de la base, la tabla y todos los campos que vas a rellenar, para el caso solo puse Nombre y Apellido pero deberias completarlo con todo lo que necesitas

    Y en el SELECT simplemente todo lo que queres insertar, tenes que fijarte que coincidan los tipos de datos, tambien supongo que vas a tener que hacer los INNER JOIN ya que son varias tablas

    Saludos

    domingo, 22 de marzo de 2020 6:45
  • Hola Ehlers Danlos:

    Create table miTabla (id int, fechaEntrada datetime, fechaSalida datetime)
    go
    insert into miTabla (id, fechaEntrada, fechaSalida)
    values
    (1,'20170225 22:00','20170225 23:00'), -- Estaba en dos momentos diferentes
    (2,'20170224 19:21','20170224 19:44'), -- NO estaba por los pelos. 
    (3,'20170226 10:30','20170226 10:50'), -- Si estaba. Conicide en una linea
    (4,'20170227 19:20','20170227 19:44'), -- No coincide
    (5,'20170224 19:20','20170224 19:44'); -- Coincide en la entrada con una linea.
    go

    Esta sería una de las tablas de tu base de datos, que indica donde estaba alguien en periodos de tiempo. (usuarios del metro).

    Para poder cruzar tu tabla con la que no tiene relación, puedes utilizar el operador exists.

    SELECT * FROM miTabla m
    where exists (
    	select * from Detecciones d
    	where d.Momento between m.fechaEntrada and m.fechaSalida
    	)

    Donde lo que realizas es verificar la existencia de un registro en la tabla detecciones, porque momento esta en el periodo que tienes en tu tabla exterior.

    Ahora ya sabes si encaja con lo que te ha dado la policía y puedes cruzar con tus tablas, para poder realizar la insert.

    exists

    https://docs.microsoft.com/es-es/sql/t-sql/language-elements/exists-transact-sql?view=sql-server-ver15

    domingo, 22 de marzo de 2020 7:17