J'ai un user_détails code> TABLE ci-dessous.
id user_id start_date end_date
4 66 2-1-2018 4-12-2018
7 99 8-1-2016 1-31-2017
4 Réponses :
Vous pouvez utiliser distincts sur code> et une clause de commande code> pour obtenir la ligne avec le dernier
start_date code> par groupe.
Ensuite, éliminez les résultats avec end_date est null code>.
Une approche est d'agréger par user_id code>, puis d'identifier les utilisateurs ayant un
end_date code> à partir du dernier enregistrement qui n'est pas
null code>. Nous utilisons un CTE pour trouver la valeur max
start_date code> pour chaque utilisateur. Dans la clause
code>, nous affirmons que lorsque le
start_date code> est la date de début la dernière date de début, le
end_date code> n'est pas non plus
null code> .
WITH cte AS (
SELECT id, user_id, start_date, end_date,
MAX(start_date) OVER (PARTITION BY user_id) max_start_date
FROM yourTable
)
SELECT
user_id,
MIN(start_date) AS start_date,
MAX(end_date) AS end_date
FROM cte
GROUP BY
user_id
HAVING
COUNT(CASE WHEN start_date = max_start_date AND
end_date IS NOT NULL THEN 1 END) > 0;
with non pas existe: Voir le Démo .
Résultats: P> | id | user_id | start_date | end_date |
| --- | ------- | ---------- | --------- |
| 4 | 66 | 2018-02-01 | 2018-04-12|
| 7 | 99 | 2016-08-01 | 2017-01-31|
pour cela, vous souhaitez un index sur distinct sur code> avec le bon indice peut être la méthode la plus efficace. Mais cet indice est assez spécifique:
(user_id, start_date Desc, end_date, id) code>. Les éléments suivants doivent avoir des performances similaires, mais avec un index plus simple:
user_details (user_id, start_date desc, id) code>. p> p>
pour chaque utilisateur mais fetch uniquement les utilisateurs ayant end_date défini i> cette condition s'applique à une rangée de cet utilisateur ou juste à la dernière ligne?
Je dois récupérer uniquement les utilisateurs ayant un ensemble End_Date pour tous les enregistrements de cet utilisateur.