sql >> Database teknologi >  >> RDS >> Sqlserver

Maks. inden for en tidsramme med datoduplikater

Hvis jeg har forstået det rigtigt, vil du tælle særskilt indtastning for en bestemt status i din tidsperiode... hvis det er tilfældet, skal du bruge DISTINCT klausul i din count() skifter fra count(*) til count(distinct Entry_id)

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(distinct Entry_Id) 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

REDIGER

Så længe du er ligeglad med, hvilken status der returneres for en given post, tror jeg, du kan ændre den indre forespørgsel for at returnere den første Status og også tilslutte dig status

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 c.Status_Id, count(c.Entry_Id) as cnt from 
 (select Entry_Id, Start_Date, (select top 1 Status_id from c where Entry_Id = CC.Entry_Id and Start_Date = CC.Start_Date) as Status_Id
  from (select Entry_Id, max(start_date) as start_date from c
  group by Entry_Id) as CC) d inner join
c on c.Entry_Id = d.Entry_Id
and c.start_date = d.start_date
and c.status_id = d.status_id
GROUP BY c.Status_Id

Resultat

Status_id Count
 489       2
 492       1
 495       1


  1. OBIEE eksporterede csv og ved import til Access får jeg en fejl

  2. Adgang til en anden brugers tabel i en Oracle Stored Procedure

  3. Sådan rettes "MySQL ERROR 1819 (HY000):" i Linux

  4. Sådan løses pakke for stor undtagelse XAMPP Mysql