2
votes

Comment filtrer l'enregistrement précédent si un champ est le même en SQL

J'ai des enregistrements comme ci-dessous:

ID            Date              Title        User 
3   2019-04-29 15:17:07.210      A           1222
4   2019-04-29 16:05:49.067      B           1048
6   2019-04-29 16:37:16.250      C           681
7   2019-04-29 16:37:49.160      D           681
8   2019-04-29 16:38:48.803      C           681

Je veux vérifier chaque enregistrement avec l'enregistrement précédent et si le titre des deux est le même, ignorez le précédent.

Je veux voir résultat comme ceci:

ID            Date              Title        User 
1   2019-04-29 14:15:55.567      A           1222
2   2019-04-29 14:25:13.530      A           1222
3   2019-04-29 15:17:07.210      A           1222
4   2019-04-29 16:05:49.067      B           1048
5   2019-04-29 16:36:37.330      C           681
6   2019-04-29 16:37:16.250      C           681
7   2019-04-29 16:37:49.160      D           681
8   2019-04-29 16:38:48.803      C           681


1 commentaires

Pourquoi y a-t-il 3 et 6 au lieu de 5?


3 Réponses :


3
votes

utilisez lag()

DEMO a>

id  dateval             title   userid
3   29/04/2019 15:17:07   A      1222
4   29/04/2019 16:05:49   B      1048
6   29/04/2019 16:37:16   C      681
7   29/04/2019 16:37:49   D      681
8   29/04/2019 16:38:48   C      681

SORTIE:

select * from
(
select *, lag(title) over(order by date desc) as prevtitle
from tablename
)A where prevtitle is null or title<>prevtitle


0 commentaires

3
votes

Utilisez lead():

select t.*
from (select t.*,
             lead(title) over (order by id) as next_title
      from t
     ) t
where next_title is null or next_title <> title;

Vous voulez utiliser lead () parce que vous voulez le plus em> valeur récente dans chaque groupe. Vous utiliseriez lag () si vous vouliez la valeur la plus ancienne.

Je ne sais pas si la commande doit être effectuée par id ou le colonne de date . Pour vos exemples de données, ils sont équivalents.


1 commentaires

@ Hossein. . . Y a-t-il une raison pour laquelle vous n'avez pas accepté cette réponse? Il semble faire exactement ce que vous voulez.



1
votes

Vous pouvez utiliser la fonction LAG pour cela:

SELECT *
FROM (
    SELECT *
         , LAG(title) OVER (ORDER BY Date) AS prev_title
    FROM t
) AS x
WHERE title <> prev_title


0 commentaires