Je me débats avec une solution pour un problème mais je n'ai rien trouvé de similaire ici.
J'ai une table "A" comme: p> et je reçois une table "B" comme: p> et ce dont j'ai besoin est de: p> J'ai essayé d'utiliser Insérer et mettre à jour mais je ne pouvais pas comprendre comment faire simultanément les deux. Y a-t-il beaucoup plus simple? Je lis à propos de CTE, cela pourrait-il être une approche? P> Je serais très reconnaissant pour votre aide! P> Edit: Plus d'exemples P> Tableau A p> tableau B p> sortie: p> initialement je viens de Demandé de diviser la plage de date et de faire une nouvelle ligne car le nouvel attribut du tableau B est entre celui du tableau A. Mais ce n'est qu'une partie du problème. Peut-être que c'est plus clair avec le nouveau jeu de données (?) P> p>
3 Réponses :
Le moyen le plus simple est de travailler avec une table de calendrier. Vous pouvez en créer un et le réutiliser plus tard.
Lorsque vous en avez un (ici, je l'ai appelé "Alldates"), vous pouvez faire quelque chose comme ceci:
Merci pour votre réponse! Je l'ai essayé et ça marche, mais pour plus d'utilisateurs, il semble prendre très longtemps
Si je comprends la demande correctement, les données du tableau A doivent être fusionnées dans le tableau B pour remplir les lacunes basées sur quatre scénarios, voici comment je l'ai atteint:
/*
Scenario 1 - Use dates from B as base to be filled in from A
- Start and end dates from B
*/
SELECT
B.UserId,
B.StartDate,
B.EndDate,
B.Attr
FROM #tmpB AS B
UNION
/*
Scenario 2 - Start date between start and end date of another record
- End date from B plus one day as start date
- End date from A as end date
*/
SELECT
B.UserId,
DATEADD(DD, 1, B.EndDate) AS StartDate,
A.EndDate,
A.Attr
FROM #tmpB AS B
JOIN #tmpA AS A ON
B.UserId = A.UserId
AND B.StartDate < A.StartDate
AND B.EndDate > A.StartDate
UNION
/*
Scenario 3 - End date between start and end date of another record or both dates between start and end date of another record
- Start date from A as start date
- Start date from B minus one as end date
*/
SELECT
B.UserId,
A.StartDate,
DATEADD(DD, -1, B.StartDate) AS EndDate,
A.Attr
FROM #tmpB AS B
JOIN #tmpA AS A ON
B.UserId = A.UserId
AND (B.StartDate < A.EndDate AND B.EndDate > A.EndDate
OR B.StartDate BETWEEN A.StartDate AND A.EndDate AND B.EndDate BETWEEN A.StartDate AND A.EndDate)
UNION
/*
Scenario 4 - Both dates between start and end date of another record
- End date from B minus one as start date
- End date from A as end date
*/
SELECT
B.UserId,
DATEADD(DD, -1, B.EndDate) AS StartDate,
A.EndDate,
A.Attr
FROM #tmpB AS B
JOIN #tmpA AS A ON
B.UserId = A.UserId
AND B.StartDate BETWEEN A.StartDate AND A.EndDate
AND B.EndDate BETWEEN A.StartDate AND A.EndDate
échantillon de données, le script, p> Votre sortie est fausse. p> Ajoutez également d'autres données d'échantillons dans le même exemple
où mon script ne fonctionne pas. p> p>
Merci beaucoup! Celui-ci m'a aidé beaucoup! J'ai vérifié mes échantillons et oui, il y avait une erreur. Mais il y a aussi une dans la deuxième rangée de la sortie de votre script. Le 'à la date doit être' 2021-02-15 'mais c'est' 2020-12-31 '
@Tunatuner, si la deuxième rangée doit être "2021-02-15" pour l'utilisateurId 1 dans ma sortie, je dois comprendre la logique derrière elle. Quelle est la différence entre la 1ère rangée et la deuxième rangée pour UserID 1.Chen seulement elle ne peut être corrigée. .
Je pense que vous avez besoin de plus d'exemples et une explication plus claire de quoi faire. Pourquoi ces lignes sont-elles dans des tables différentes? À quelle profondeur les périodes peuvent-elles être imbriquées?
@Gordonlinoff Tableau B est des données d'un autre système. Je reçois les attributs et une plage de dates où il va y être utilisé. Je peux obtenir plusieurs gammes de date pour chaque identifiant d'utilisateur, ils ne se chevauchent pas dans B, mais ils peuvent dans le tableau A. Puis-je répondre à vos questions?
@Larnu j'ai édité ma question et ajouté plus d'échantillons. Merci pour votre temps! Est-ce compréhensible maintenant? J'ai juste besoin d'une solution pour ajouter une nouvelle ligne avec la plage de données du tableau B tout en modifiant la date de fin du tableau A (Date de début moins un jour) et ajoutez simultanément une nouvelle ligne à la table A avec la date de fin du tableau B plus un jour de début jour et le premier jour de fin de la table A comme date de fin
@Tunatuner, je pense que votre production est fausse dans quelques endroits. Je vais le réviser et les soins à expliquer.