Pregunta

Tengo que insertar valores en una nueva columna en nuestra base de datos, pero no puedo entender esto de una manera consistente. Hay una gran cantidad de datos, por lo que hacer cualquier cosa manualmente es prácticamente imposible. Déjame poner el escenario:

Tenemos una tabla llamada Ocurrencia y una tabla llamada OccurenceBuckets donde cada aparición hace referencia al grupo al que se le ha asignado. Anteriormente, se trataba de una referencia en un solo sentido, pero por varias razones hemos decidido agregar una referencia desde el OccurrenceBucket a la primera Ocurrencia (la primera en el tiempo, es decir). Las tablas ahora se ven así:

CREATE TABLE Occurrence
  OccurrenceID uniqueidentifier,
  OccurrenceBucketID uniqueidentifier,
  OccurrenceTime datetime,
  OccurrenceMessage nvarchar
  ...other meta data...

CREATE TABLE OccurrenceBucket
  OccurrenceBucketID uniqueidentifier,
  ...other meta data...
  FirstOccurrenceID uniqueidentifier,
  FirstOccurrenceTime datetime,
  FirstOccurrenceMessage nvarchar

Estoy buscando una manera de determinar la primera aparición que pertenece a un grupo y asignando FirstOccurrenceID, FirstOccurrenceTime y FirstOccurrenceMessage con valores de esta primera aparición para todos mis eventos de ocurrencia.

¿Alguno de ustedes, los expertos de sql-fu, tienen tiempo para ayudarme, todos mis intentos han sido producidos para producir una selección incorrecta o incompleta de las ocurrencias?

¿Fue útil?

Solución

Puedes probar esto

DECLARE @Occurrence TABLE(
        OccurrenceID INT,
        OccurrenceBucketID INT,
        OccurrenceTime DATETIME,
        OccurrenceMessage VARCHAR(MAX)
)

INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)  
SELECT 1, 1, '01 Jan 2009', 'A'
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)  
SELECT 2, 1, '02 Jan 2009', 'B'
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)  
SELECT 3, 1, '03 Jan 2009', 'C'


INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)  
SELECT 4, 2, '04 Jan 2009', 'D'
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)  
SELECT 5, 2, '05 Jan 2009', 'E'
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)  
SELECT 6, 2, '06 Jan 2009', 'F'

SELECT * FROM @Occurrence

DECLARE @OccurrenceBucket TABLE(
        OccurrenceBucketID INT,
        FirstOccurrenceID INT,
        FirstOccurrenceTime DATETIME,
        FirstOccurrenceMessage VARCHAR(MAX)
)

INSERT INTO @OccurrenceBucket (OccurrenceBucketID) SELECT 1
INSERT INTO @OccurrenceBucket (OccurrenceBucketID) SELECT 2

SELECT * FROM @OccurrenceBucket


UPDATE  @OccurrenceBucket
SET     FirstOccurrenceID = OccurrenceID,
        FirstOccurrenceTime = OccurrenceTime,
        FirstOccurrenceMessage = OccurrenceMessage
FROM    @OccurrenceBucket oc INNER JOIN
        (
            SELECT  o.*
            FROM    @Occurrence o INNER JOIN
                    (
                        SELECT  OccurrenceBucketID,
                                MIN(OccurrenceID) FirstOccurrenceID
                        FROM    @Occurrence
                        GROUP BY OccurrenceBucketID
                    ) Mins ON o.OccurrenceID = mins.FirstOccurrenceID
        ) Vals ON oc.OccurrenceBucketID = Vals.OccurrenceBucketID

SELECT * FROM @OccurrenceBucket

EDITAR:

UPDATE  @OccurrenceBucket 
SET     FirstOccurrenceID = OccurrenceID, 
        FirstOccurrenceTime = OccurrenceTime, 
        FirstOccurrenceMessage = OccurrenceMessage 
FROM    @OccurrenceBucket oc INNER JOIN 
        ( 
                SELECT  o.* 
                FROM    @Occurrence o INNER JOIN 
                                ( 
                                        SELECT  OccurrenceBucketID, 
                                                        MIN(OccurrenceTime) FirstOccurrenceTime 
                                        FROM    @Occurrence 
                                        GROUP BY OccurrenceBucketID 
                                ) Mins ON o.OccurrenceTime = mins.FirstOccurrenceTime 
        ) Vals ON oc.OccurrenceBucketID = Vals.OccurrenceBucketID 

Otros consejos

Bueno, para encontrar la primera aparición en un cubo, ¿no debería funcionar lo siguiente?

SELECT TOP 1
  OccurranceID, OccurranceTime, OccurranceMessage
FROM Occurance
WHERE
  OccurranceBucketID = @OccurranceBucketID
ORDER BY
  OccurranceTime ASC

Puede asignar los campos devueltos a las variables y luego actualizar su OccurranceBucket en consecuencia.

NB: " ocurrencia " no tiene " a " en ella.

Esta respuesta se basa en que OccurrenceTime es único para cada aparición: -

actualizar OccBuck set
OccBuck.FirstOccurrenceID = Occ.OccurrenceID,
OccBuck.FirstOccurrenceTime = Occ.OccurrenceTime,
OccBuck.FirstOccurrenceMessage = Occ.OccurrenceMessage
de
dbo.OccurrenceBucket como OccBuck
internal join dbo.Occurrence as Occ en OccBuck.OccurrenceBucketID = Occ.OccurrenceBucketID
unión interna (seleccione OccurrenceBucketID,
MIN (OccurrenceTime) como 'MinOccurrenceTime'
de dbo.Occurrence
group by OccurrenceBucketID) como minOcc en Occ.OccurrenceBucketID = minOcc.OccurrenceBucketID y
Occ.OccurrenceTime = minOcc.MinOccurrenceTime

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top