J'ai un problème de T-SQL que je trouve difficile à résoudre.Auto-jointure à la plus faible occurrence du groupe
J'ai une table avec des groupes d'enregistrements, regroupés par key1 et key2. Je commande chaque groupe chronologiquement par date. Pour chaque enregistrement, je veux voir s'il existait un enregistrement avant (dans le groupe et avec une date inférieure) pour lequel le champ "datafield" forme une combinaison autorisée avec le "datafield" de l'enregistrement en cours. Pour les combinaisons autorisées, j'ai une table appelée AllowedCombinationsTable.
I écrit le code suivant pour y parvenir:
WITH Source AS (
SELECT key1, key2, datafield, date1,
ROW_NUMBER() OVER(PARTITION BY key1, key2 ORDER BY date1 ASC) AS dateorder
FROM table
)
SELECT L.key1, L.key2, L.datafield, DC.datafield2
FROM Source AS L
LEFT JOIN AllowedDataCombinationsTable DC
ON D.datafield1 = L.datafield
LEFT JOIN Source AS R
ON R.Key1 = L.Key1
AND R.Key2 = L.Key2
AND R.dateorder < L.dateorder
AND DC.datafield2 = L.datafield
-- AND "pick the one record with lowest dateorder"
Maintenant, pour chacun de ces enregistrements de combinaisons possibles, je veux choisir le premier (voir espace réservé dans le code). Comment puis-je le faire le plus efficacement?
EDIT: OK, disons que pour la source, ne montrant que le groupe (1, 1):
**Key1 Key2 Datafield Date DateOrder**
1 1 "Horse" 1-Jan-2010 1
1 1 "Horse" 2-Jan-2010 2
1 1 "Sheep" 3-Jan-2010 3
1 1 "Dog" 4-Jan-2010 4
1 1 "Cat" 5-Jan-2010 5
AllowedCombinationsTable:
**Datafield1 Datafield**
Cat Sheep (and Sheep Cat)
Cat Horse (and Horse Cat)
Dog Horse (and Horse Dog)
Après mon rejoindre J'ai maintenant:
**Key1 Key2 Datafield Date DateOrder JoinedCombination JoinedCombinationDateOrder**
1 1 "Horse" 1-Jan-2010 1 NULL NULL
1 1 "Horse" 2-Jan-2010 2 NULL NULL
1 1 "Sheep" 3-Jan-2010 3 NULL NULL
1 1 "Dog" 4-Jan-2010 4 "Horse" 1
1 1 "Dog" 4-Jan-2010 4 "Horse" 2
1 1 "Cat" 5-Jan-2010 5 "Horse" 1
1 1 "Cat" 5-Jan-2010 5 "Horse" 2
1 1 "Cat" 5-Jan-2010 5 "Sheep" 3
Je veux afficher seulement le premier "Cheval" pour l'enregistrement 4 "Chien", et aussi seulement le premier "Cheval" pour l'enregistrement 5 "Chat".
L'obtenir? ;)
Si vous pouviez fournir une liste table/colonne et expliquer les relations un peu plus clairement, je serais prêt à écrire une réponse. – Fosco
OK, j'ai ajouté quelques exemples de données. – thomaspaulb