J'ai une table comme celui-ciMax dans un délai avec la date duplique
DateTime start_time not null,
DateTime end_time not null,
Status_Id int not null,
Entry_Id int not null
Je veux obtenir le nombre de chaque état dans un délai de temps, où seul le dernier démarrage est valable pour une entry_id donnée.
Ce que je me sers maintenant est la suivante (avec des dates dynamiques):
with c (Status_Id, Entry_Id, Start_Date) AS (
select Status_Id, Entry_Id, Start_Date from tbl where
(End_Date BETWEEN '19000101' AND '21000101')
AND ((Start_Date BETWEEN '19000101' AND '21000101')
OR End_Date <= '21000101'))
select Status_Id, count(*) as cnt from
(select Entry_Id, max(start_date) as start_date from c
group by Entry_Id) d inner join
c on c.Entry_Id = d.Entry_Id
and c.start_date = d.start_date
GROUP BY Status_Id WITH ROLLUP
Le problème est qu'il compte mal quand il y a des entry_id qui ont des entrées multiples de la même start_date. (Je ne me soucie pas particulièrement que le statut est choisi dans ce cas, il suffit que seulement 1 est choisi)
Certaines données de test:
status_id Entry_id Start_date
496 45173 2010-09-29 18:04:33.000
490 45173 2010-09-29 18:48:20.100
495 45173 2010-09-29 19:25:29.300
489 45174 2010-09-29 18:43:01.500
493 45175 2010-09-29 18:48:00.500
493 45175 2010-09-29 21:16:02.700
489 45175 2010-09-30 17:52:12.100
493 45176 2010-09-29 17:55:21.300
492 45176 2010-09-29 18:20:52.200 <------ This is the one that gives the problems
493 45176 2010-09-29 18:20:52.200 <------ This is the one that gives the problems
Le résultat devrait être
495 1
489 2
492 1 (or 493 1)
Ohh, c'est une très très belle solution! (Votre édition est cassée cependant, le numéro de la ligne doit être dans le select). Il est aussi deux fois plus rapide que celui que j'ai inventé, puisqu'il n'a pas à dupliquer l'élimination, juste un type spécialisé – Cine