1
votes

Obtenez le dernier enregistrement des clients par date

Je souhaite obtenir le dernier numéro de téléphone du client par date. Il existe plusieurs entrées pour le même client. Mais hors de cela, je ne veux que l'enregistrement qui a la date maximale.

Exemple de données,

|cust_id |  phone   |    hist_date
|  A     |  1393    |    2018-10-02
|  B     |  6382    |    2017-10-02

Le résultat souhaité est

|cust_id |  phone   |    hist_date
|  A     |  1234    |    2015-10-02
|  A     |  4567    |    2016-10-02
|  A     |  7896    |    2017-10-02
|  B     |  6456    |    2015-10-02
|  B     |  8621    |    2016-10-02
|  B     |  6382    |    2017-10-02
|  A     |  1393    |    2018-10-02

Veuillez ne pas le coder en dur avec l'année. J'ai besoin qu'il soit dynamique pour qu'à chaque fois, seul le dernier enregistrement de date s'affiche. Je sais que cela peut être réalisé par sous-requête et CTE en utilisant le numéro de ligne. J'ai essayé mais je n'ai pas réussi. Merci beaucoup pour l'aide.


2 commentaires

Qu'est-ce qui n'allait pas avec les doublons suggérés (très probables) qui vous ont été présentés lors de la rédaction de cette question? C'est une question très courante sur SO, et il y a beaucoup de questions en double avec des réponses (ou des liens vers lesdits doublons). Quelles tentatives avez-vous faites et pourquoi n'ont-elles pas fonctionné?


J'ai essayé d'utiliser CTE mais je n'ai pas pu le rendre dynamique. Je l'ai codé en dur avec la dernière année. J'ai vu les questions suggérées, mais je n'ai pas compris ces questions, c'est pourquoi j'ai posé les questions séparément


3 Réponses :


1
votes

utilisez la fonction de fenêtre row_number ()

select * from
(
select *, row_number() over(partition by cus_id order by hist_date desc) as rn
from logic
)A where rn=1


0 commentaires

2
votes

utilisez la row_number () fonction analytique

 select t1.* from logic t1
 where t1.hist_date=( select max(hist_date) 
                     from logic t2 where  t1.cust_id=t2.cust_id
                     )

ou vous pouvez utiliser la sous-requête corelate

select * from 
(select *,row_number()over(partition by cust_id order by hist_date desc) rn
from logic
) t where t.rn=1


7 commentaires

Sans group by peut-on utiliser cust_id dans where avec la fonction d'agrégation. Vérifiez s'il vous plaît.


@SurajKumar oui nous pouvons


Mon nom de table est logique. mais j'obtiens une erreur de syntaxe en essayant row_number ()


@UtkarshSharma SQL Server prend en charge row_number () donc cela ne peut pas être comme ça plz nous montrer l'erreur


Merci beaucoup. Fonctionne parfaitement.


@ZaynulAbadinTuhin Je ne sais pas comment faire ça.


@ZaynulAbadinTuhin J'ai compris.



0
votes

Vous pouvez également essayer la requête suivante.

Select a.* from temp a
inner join (
Select cust_id, MAX(hist_date) as hist_date from temp
group by cust_id
)b on a.cust_id = b.cust_id and a.hist_date = b.hist_date

Maintenant la requête réelle.

create table temp(cust_id char(1),  phone char(5),  hist_date date)
insert into temp values
('A', '1234', '2015-10-02'),
('A', '4567', '2016-10-02'),
('A', '7896', '2017-10-02'),
('B', '6456', '2015-10-02'),
('B', '8621', '2016-10-02'),
('B', '6382', '2017-10-02'),
('A', '1393', '2018-10-02')

Démo en direct


0 commentaires