sql >> Databasteknik >  >> RDS >> Sqlserver

Max inom en tidsram med datumdubbletter

Om jag förstod rätt, vill du räkna distinkt post för en specifik status under din tidsperiod... om det är så ska du använda DISTINCT sats i din count() ändras från count(*) till 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

REDIGERA

Så länge du inte bryr dig om vilken status som returneras för en given post, tror jag att du kan ändra den inre frågan för att returnera den första statusen och gå med i statusen också

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. Dubbelkontroll mellan DATABASE och DATABLE

  2. Intervjutips för SQL-databasadministratör

  3. Oracle SQL returnerar rader på godtyckligt sätt när ingen order by-sats används

  4. importera mysql-data till kubernetes pod