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.
3 Réponses :
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
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
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.
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')
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