Question

Pour commencer par: mon titre est nul, alors aide-moi à trouver un nouveau

Je ne peux pas poster toutes les SQL ici (plus de 30k caractères pour le lot de celui-ci), donc je coincé sur pastebin.com

Le problème:

je reçois un fichier XML que je gratter quelques enregistrements de, et j'ai besoin d'extraire des données à partir des enregistrements et de construire une autre table dehors. Les dossiers sont un événement va au large et à venir, et j'ai inclus les données échantillon dans le pastebin pour la recréation. Sans voir les données, il est un peu difficile à expliquer. J'ai donné toutes les données dont je dispose de mon échantillon d'importation qui devrait être suffisant pour construire l'application hors de, mais je ne reçois pas plus d'informations que ce qui est montré dans les données.

Je vais vous donner un moment de jeter un regard sur les données donc ce sens.

Alors, ce que je dois faire est la suivante: Pour chaque « off » événement, je dois correspondre à l'étape suivante « sur » l'événement, et je dois avoir deux tables à la fin, une table pour « événements historiques » et une table pour « l'actualité ». Cependant, si je peux obtenir des « événements historiques » construit correctement, je peux comprendre comment obtenir « l'actualité » de cela.

règles d'entreprise:

Si deux ou plusieurs « off » les événements sont collectés avant un « sur » l'événement, garder le plus ancien « off » événement. Si deux ou plusieurs « sur » les événements sont collectés avant un événement « off », garder le plus récent « sur » l'événement. S'il y a une paire complète, les mettre dans la table historique. S'il y a un « off » événement et non un « sur » l'événement, mettre dans la table en cours (donc si je voulais garder l'insertion / suppression de ce tableau, qui est très bien aussi). S'il y a un « off » événement déjà dans le tableau actuel, je peux le prendre et de le déplacer à la table historique pour un « sur » l'événement étant lu (ce qui devra être mis en œuvre plus tard, mais si je peux obtenir les appariements apparié d'abord je vais pouvoir aller de l'avant pour l'instant.

Je pense que ce à peu près pour la logique. Mes pensées sont soit comprendre comment faire dans SQL ou pousser dehors à une application écrite en C # et de le faire avec des listes temporaires en C # et construire ce que je besoin de l'aide pour ... suivant logique. Cela peut être infiniment plus facile en C #, mais j'ai un SQL sentiment peut faire ce travail aussi facilement que C # peut, donc je besoin de l'aide des gourous dba.

Les requêtes que je l'ai déjà ne fonctionnent pas , mais c'est où j'ai appris à mon départ avant de rentrer chez vendredi, et j'ai ressassant depuis lors, et la construction d'un problème d'échantillon que je peux mettre en ligne (et cette chose vie trop tu sais). Les données sont données en direct et exactes, à l'exception anonymisée de l'ID et les champs de texte changé pour quelque chose simple à utiliser.

Voici une feuille de calcul montrant à peu près comment je veux les données à regarder la fin et la façon dont il semble maintenant. Il y a des données de courant (avec une ligne d'espacement entre chaque ID pour plus de clarté), les données qui seraient dans le tableau historique (aligné avec l'ID de données d'origine pour la compréhension) et la table de courant (aligné à nouveau). J'espère que cela peut aider à clarifier les règles d'affaires. https://spreadsheets.google.com/ccc?key=0AuvCdeHuVU5ddHRCNkpuWHBUREpRajlmLU5VX2xsWnc&hl=en&authkey=COq7y50H

SQL complète, y compris TableDefs et actuelle (très pas droit) requêtes est sur pastebin http://pastebin.com/k2f2CLnQ

Était-ce utile?

La solution 2

Donc, pour commentaires continue, et comme ce sera probablement la réponse:

Je viens juste de passer avant et exporté vers C # et le traitement là. Il sera plus facile de le faire que la procédure par des ensembles, et je encore besoin de comprendre ce qui vient en premier, au large ou sur (quand ils sont en même temps). Travailler avec leur PM savoir, mais j'ai le sentiment même qu'ils ne savent pas ce qui se passe quand.

Quoi qu'il en soit, de sorte que toute la discussion est conservée dans un endroit, voir cette transcription aussi: (si vous êtes vraiment intéressé) http://chat.stackexchange.com/rooms/179/conversation/date-alignment-and-pair-matching -extraction-best-fait-avec-tsql-ou c donc il n'y a que.

Autres conseils

de quelque chose de Ici, je tripotait basé sur un travail que j'avais autour de la pose. Il ne pas gérer les événements regroupés en une seule fois bien. Il pourrait théoriquement être utile de toute façon ...:)

;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
Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top