-1
votes

Groupe en ignorant des groupes contenant une valeur nulle et récupérez l'enregistrement récent par date de chaque groupe

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


2 commentaires

pour chaque utilisateur mais fetch uniquement les utilisateurs ayant end_date défini 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.


4 Réponses :


4
votes

Vous pouvez utiliser distincts sur et une clause de commande pour obtenir la ligne avec le dernier start_date par groupe.
Ensuite, éliminez les résultats avec end_date est null . xxx


0 commentaires

0
votes

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;


0 commentaires

0
votes

with non pas existe: xxx pré>

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|


0 commentaires

0
votes

distinct sur 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) . Les éléments suivants doivent avoir des performances similaires, mais avec un index plus simple: xxx

pour cela, vous souhaitez un index sur user_details (user_id, start_date desc, id) .


0 commentaires