allineamento Data ed estrazione coppia corrispondente fatto meglio con TSQL o C #?

dba.stackexchange https://dba.stackexchange.com/questions/1103

  •  16-10-2019
  •  | 
  •  

Domanda

Per cominciare con:? Il mio titolo fa schifo, quindi aiutarmi a capire uno nuovo

non riesco a postare tutte le SQL qui (oltre 30k caratteri per il sacco di esso), quindi ho attaccato su pastebin.com

Il problema:

ottengo un file XML che ho raschiare alcuni record da, e ho bisogno di estrarre alcuni dati da record e costruire un altro tavolo fuori di esso. I record sono per un evento andare fuori e in arrivo, e ho incluso i dati di esempio nel pastebin per ricreare. Senza vedere i dati che è un po 'difficile da spiegare. Ho dato tutti i dati che ho dal mio importazione campione che dovrebbe essere sufficiente per costruire l'applicazione fuori di, ma io non ricevo alcuna più informazioni rispetto a ciò che viene mostrato nei dati.

ti darò un momento per sguardo al di dati in modo da questo ha un senso.

Quindi quello che dobbiamo fare è questo: per ogni "off" evento, ho bisogno di abbinarlo alla prossima "on" dell'evento, e ho bisogno di avere due tabelle, alla fine, un tavolo per "eventi storici" e una tabella per "eventi correnti". Tuttavia, se posso solo ottenere "eventi storici" costruiti correttamente riesco a capire come ottenere "eventi correnti" da questo.

Le regole di business:

Se due o più "off" gli eventi vengono raccolti prima di un "on" evento, mantenere il più antico "off" evento. Se due o più "in" eventi vengono raccolti prima di un "off" evento, mantenere il più recente "on" evento. Se c'è una coppia completa, metterli nella tabella storica. Se c'è un "off" evento e non un "on" evento, metterlo nella tabella corrente (quindi se volevo continuare l'inserimento / cancellazione da questa tabella, va bene ugualmente). Se c'è un "off" evento già nella tabella corrente posso prenderlo e spostarlo in tavola storica per un "on" evento in corso la lettura in (questo dovrà essere attuato in seguito, ma se posso ottenere gli accoppiamenti abbinati inizialmente sarò in grado di andare avanti, per ora.

Credo che sia più o meno per la logica. I miei pensieri sono a uno a capire come fare questo in SQL o spingerla fuori per un app scritto in C # e lo fanno con alcuni elenchi provvisori in C # e costruire quello che ho bisogno che utilizzano per il ... prossimo logica. Questo può essere infinitamente più facile in C #, ma ho la sensazione di SQL può fare questo lavoro altrettanto facilmente come C # può, quindi ho bisogno di un po 'di aiuto da parte dei guru dba.

Le query che ho già non lavoro , ma è lì che ho avuto modo di iniziare con la mia prima di andare a casa il Venerdì, e sono stato a rimuginare da allora, e la costruzione di un problema di esempio che posso pubblicare online (e che tutta la faccenda la vita troppo ya sapere). I dati sono dati in tempo reale e precisi, tranne l'ID di essere anonimi e campi di testo modificati per qualcosa di semplice con cui lavorare.

Ecco un foglio di calcolo che mostra più o meno come voglio i dati di guardare alla fine e il suo aspetto ora. C'è i dati correnti (con una riga distanziatore tra ogni ID per chiarezza), i dati che sarebbero nella tabella storica (allineata con l'ID dei dati originali per la comprensione) e la tabella corrente (nuovamente allineata). Spero che questo può aiutare a chiarire le regole di business. https://spreadsheets.google.com/ccc?key=0AuvCdeHuVU5ddHRCNkpuWHBUREpRajlmLU5VX2xsWnc&hl=en&authkey=COq7y50H

Così lo SQL completa compreso TableDefs e corrente (molto non-destra) interroga è in pastebin http://pastebin.com/k2f2CLnQ

È stato utile?

Soluzione 2

Quindi, per continuare il commento, e come quello che sarà probabilmente la risposta:

Ho appena andato avanti e ha esportato in C # e l'elaborazione di lì. Sarà più facile per farlo procedurale che da gruppi, e ho ancora bisogno di capire quale viene prima, o disattivata (quando sono concomitante). Lavorare con loro PM di sapere, ma ho una sensazione ancora non sanno che avviene quando.

In ogni modo, in modo che tutta la discussione è tenuto in un unico luogo, vedere questa trascrizione troppo: (se siete veramente interessati) http://chat.stackexchange.com/rooms/179/conversation/date-alignment-and-pair-matching -Estrazione-best-fatto-con-TSQL-o-c quindi non c'è che.

Altri suggerimenti

è qui qualcosa che stava armeggiando con base a qualche lavoro che avevo sparso in giro. E ' non gestire gli eventi in cluster in una sola volta bene. Si potrebbe in teoria essere utile in ogni caso ...:)

;WITH ordered_rows AS
(
    SELECT ROW_NUMBER() OVER(PARTITION BY Identifier ORDER BY EventTime) AS Row,
        Identifier, Type, EventTime, DiscoveredDate, FileId FROM #EventDataTemp
)
,filtered_rows AS
(
    SELECT Row, Identifier, Type, EventTime, DiscoveredDate, FileId, 
        CAST(CASE Type WHEN 'Went Off' THEN 1 ELSE NULL END AS INT) 
            AS OffEventRow
    FROM ordered_rows
    WHERE Row = 1
    UNION ALL
    SELECT o.Row, o.Identifier, o.Type, o.EventTime, o.DiscoveredDate, o.FileId,
        CAST(CASE WHEN o.Type = 'Went Off' AND f.Type = 'Went Off' 
            OR o.Type = 'Came On' THEN f.OffEventRow ELSE o.Row END AS INT)
    FROM ordered_rows o INNER JOIN filtered_rows f 
        ON o.Row = f.Row + 1 AND o.Identifier = f.Identifier
)
,on_events AS
(
   SELECT Identifier, OffEventRow, MAX(Row) AS OnRow
   FROM filtered_rows
   WHERE Type = 'Came On' AND OffEventRow IS NOT NULL
   GROUP BY OffEventRow, Identifier
)
SELECT f.Identifier, f.Type, f.EventTime, f.DiscoveredDate, f.FileId 
FROM filtered_rows f LEFT JOIN on_events o 
    ON f.Identifier = o.Identifier 
    AND f.Row = o.OnRow
WHERE f.Type = 'Went Off' AND f.Row = f.OffEventRow
OR f.Type = 'Came On' AND o.OnRow IS NOT NULL
ORDER BY f.Identifier, f.EventTime
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top