Frage

Ich muss Werte in eine neue Spalte in unserer Datenbank einfügen, aber ich kann es nicht auf konsistente Weise machen. Es gibt viele Daten, daher ist es so ziemlich in Frage, dass alles manuell ist. Lassen Sie mich die Bühne einstellen:

Wir haben eine Tabelle, die als Vorkommen und eine Tabelle bezeichnet wird, die als Auftreten von Buckets bezeichnet wird, in dem jedes Vorkommen auf den Eimer referenziert, dem sie zugewiesen wurden. Früher war dies eine Einweg-Referenz, aber aus verschiedenen Gründen haben wir beschlossen, eine Referenz vom Vorkommen zum ersten Ereignis zurückzuführen (zuerst in der Zeit). Die Tische sehen jetzt so aus:

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

Ich suche nach einer Möglichkeit, das erste Ereignis zu einem Eimer zu bestimmen und das FirstOccurceId, FirstOccurrencetime und FirstOccurrencemessage mit Werten aus diesem ersten Ereignis für alle meine Auftreten zuzuweisen.

Machen Sie einen von Ihnen SQL-FU-Experten da draußen Zeit, mir zu helfen, alle meine Versuche, eine falsche oder unvollständige Auswahl von Vorkommen zu erzeugen.

War es hilfreich?

Lösung

Sie können dies versuchen

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

BEARBEITEN:

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 

Andere Tipps

Nun, um das erste Ereignis in einem Eimer zu finden, sollte nicht die folgenden Arbeiten funktionieren?

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

Sie können die zurückgegebenen Felder Variablen zuweisen und dann Ihren Auftritt entsprechend aktualisieren.

NB: "Vorkommen" hat kein "A" darin.

Diese Antwort beruht darauf, dass das Ereignis für jedes Ereignis einzigartig ist: -

Update Occbuck Set
Occbuck.firstoccurceId = occ.occurceId,
OCCBUCK.FIRSTOCCURENCETIME = OCC.Occurrencetime,
Occbuck.firstoccurrencemessage = occ.occurrencemessage
aus
dbo.occurrenceBucket als Occbuck
innerer Join dbo.occurce als OCC bei OCCBUCK.OccurrenceBucketID = OCC.OccurceBucketID
innerer Join (Wählen Sie Ereignis aus
Min (Vorkehrung) als "minokcurrencetime"
Aus DBO.Occurce
Gruppe durch AuftretenBucketid) als minokc bei occcurceBucketid = minocc.OccurceBucketid und
Occ.occurrencetime = minocc.minoccurrencetime

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top