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
3 Réponses :
utilisez lag()
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
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.
@ 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.
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
Pourquoi y a-t-il 3 et 6 au lieu de 5?