2016-10-26 4 views
0

Ich möchte die missing NON-consecutive dates zwischen zwei aufeinander folgenden Datum finden.Suchen nicht aufeinander folgenden Datum in SQL Server

Ich posten meine SQL-Abfrage und temporäre Tabellen, um die Ergebnisse zu finden.

Aber ich bin nicht die richtigen Ergebnisse zu erzielen

Hier ist meine SQL Query

drop table #temp 
    create table #temp(an varchar(20),dt date) 
    insert into #temp 
    select '2133783715' , '2016-10-16' union all 
    select '5107537880' , '2016-10-15' union all 
    select '6619324250' , '2016-10-15' union all 
    select '7146586717' , '2016-10-15' union all 
    select '7472381321' , '2016-10-12' union all 
    select '7472381321' , '2016-10-13' union all 
    select '7472381321' , '2016-10-14' union all 
    select '7472381321' , '2016-10-24' union all 
    select '8186056340' , '2016-10-15' union all 
    select '9099457123' , '2016-10-12' union all 
    select '9099457123' , '2016-10-13' union all 
    select '9099457123' , '2016-10-14' union all 
    select '9099457123' , '2016-10-23' union all 
    select '9099457123' , '2016-11-01' union all 
    select '9099457123' , '2016-11-02' union all 
    select '9099457123' , '2016-11-03' union all 
    select '9165074784' , '2016-10-16' 


drop table #final 
SELECT an,MIN(dt) AS MinDate,MAX(dt) AS MaxDate, COUNT(*) AS ConsecutiveUsage 
    --DateDiff(Day,LAG(MAX(dt)) OVER (partition by an ORDER BY an),MAX(dt)) nonusageDate 
into #final 
    FROM(
    SELECT an,dt, 
    DATEDIFF(D, ROW_NUMBER() OVER(partition by an ORDER BY dt),dt) AS Diff 
    FROM #temp c 
)P 
GROUP BY an,diff 

select * from #final order by 1 

an    MinDate  MaxDate  ConsecutiveUsage  
2133783715  2016-10-16 2016-10-16 1  
5107537880  2016-10-15 2016-10-15 1  
6619324250  2016-10-15 2016-10-15 1  
7146586717  2016-10-15 2016-10-15 1  
7472381321  2016-10-12 2016-10-14 3  
7472381321  2016-10-24 2016-10-24 1 
7472381321  2016-10-27 2016-10-28 1 
8186056340  2016-10-15 2016-10-15 1  
9099457123  2016-10-12 2016-10-14 3  
9099457123  2016-10-23 2016-10-23 1  
9165074784  2016-10-16 2016-10-16 1  

Aber ich will Ergebnisse Nichtnutzung Datum.

Ich möchte die AN erhalten, die seit 10 Tagen nicht mehr benutzt wurde.

Also hier Ausgabe sollte wie folgt sein: -

an   minusagesdate maxusagedate  ConsecutiveNotUseddays  
    7472381321 2016-10-15  2016-10-23   9 
    7472381321 2016-10-25  2016-10-26   2 
    9099457123 2016-10-15  2016-10-22   8 

So finden Sie heraus, ich will nur nur in Folge nicht verwendet Daten zählen und ihre Min- und Max-Termine.

+0

Warum ist ConsecutiveNotUseddays 10 und 11? Ich kann nicht sehen, wo diese Zahlen herkommen. – BeanFrog

+0

Ich möchte aufeinander folgende Daten von nicht verwendet werden. wie für ein 7472381321 min Datum 2016-10-12 und maximales Datum ist 2016-10-14. Danach begann er am 2016-10-24 zu verwenden. also möchte ich keine Verwendungsdaten wie diese 7472381321 mindate 2016-10-15 und maxdate - 2016-10-23 und zählen: 8. –

Antwort

1

versuchen Sie dies:

with ranked as (
    select f1.*, 
    ROW_NUMBER() over(partition by an order by dt) rang 
    from #temp f1 
    where exists 
    (select * from #temp f2 
    where f1.an=f2.an and datediff(day, f2.dt, f1.dt) >1 
) 
) 
    select an, minusagesdate, maxusagesdate, ConsecutiveNotUseddays 
    from (
    select f1.*, 
    DATEADD(DAY,1, (select f2.dt from ranked f2 where f1.an=f2.an and f2.rang+1=f1.rang)) minusagesdate , 
    DATEADD(DAY,-1, f1.dt) maxusagesdate , 
    datediff(day, (select f2.dt from ranked f2 where f1.an=f2.an and f2.rang+1=f1.rang), f1.dt) - 1 ConsecutiveNotUseddays 
    from ranked f1 
) tmp 
    where tmp.ConsecutiveNotUseddays>0 

oder ähnliche

with ranked as (
    select f1.*, 
    ROW_NUMBER() over(partition by an order by dt) rang 
    from #temp f1 
    where exists 
    (select * from #temp f2 
    where f1.an=f2.an and datediff(day, f2.dt, f1.dt) >1 
) 
) 
    select f1.an, 
    DATEADD(DAY,1, f3.dtbefore) minusagesdate , 
    DATEADD(DAY,-1, f1.dt) maxusagesdate , 
    datediff(day, f3.dtbefore, f1.dt) - 1 ConsecutiveNotUseddays 
    from ranked f1 
    outer apply 
    (
    select top 1 f2.dt as dtbefore from ranked f2 
    where f1.an=f2.an and f2.rang+1=f1.rang 
    ) f3 
    where datediff(day, f3.dtbefore, f1.dt) - 1>0 
+0

Ich möchte aufeinander folgende Daten von nicht verwendet werden. wie für ein 7472381321 min Datum 2016-10-12 und maximales Datum ist 2016-10-14. Danach begann er am 2016-10-24 zu verwenden. also möchte ich keine Verwendungsdaten wie diese 7472381321 mindate 2016-10-15 und maxdate - 2016-10-23 und zählen: 8. –

+0

ändern Sie Ihr Beispiel ... – Esperento57

+0

haben Sie meine Änderungen gesehen? Ich möchte Code für das .. –

0

Es sieht aus wie Sie die Anzahl der Tage nicht versuchen, zwischen dem MinDate und dem MaxDate für jeden an verwendet zu zählen. Wenn das der Fall ist, dann sollte dies den Trick:

select an, min(dt) as min_dt, max(dt) as max_dt 
    , count(distinct dt) as daysused --this counts each day used, but only once 
    , datediff(day,min(dt),max(dt)) as totaldays --this is the total number of days between min and max date 
    , datediff(day,min(dt),max(dt)) - count(distinct dt) as daysnotused 
      --This takes total days - used days to give non-used days 
from #temp c 
group by an 
having datediff(day,min(dt),max(dt)) - count(distinct dt) >= 10 
+0

Ich möchte aufeinander folgende Daten von nicht verwendet werden. wie für ein 7472381321 min Datum 2016-10-12 und maximales Datum ist 2016-10-14. Danach begann er am 2016-10-24 zu verwenden. also möchte ich keine Verwendungsdaten wie diese 7472381321 mindate 2016-10-15 und maxdate - 2016-10-23 und zählen: 8. –

0

Wie ich verstanden Sie brauchen diese:

;WITH cte AS (
    SELECT an, 
      dt, 
      ROW_NUMBER() OVER (PARTITION BY an ORDER BY dt) as rn 
    FROM #temp 
) 

SELECT c1.an, 
     c1.dt MinDate, 
     c2.dt MaxDate, 
     DATEDIFF(day,c1.dt,c2.dt) as ConsecutiveNotUseddays 
FROM cte c1 
INNER JOIN cte c2 
    ON c1.an = c2.an AND c1.rn = c2.rn-1 
WHERE DATEDIFF(day,c1.dt,c2.dt) >= 10 

Ausgang:

an   MinDate  MaxDate  ConsecutiveNotUseddays 
7472381321 2016-10-14 2016-10-24 10 

Für 9099457123 Ich habe zwei Reihen mit 9 in ConsecutiveNotUseddays. Sie können die Ergebnisse überprüfen, indem Sie die WHERE-Anweisung entfernen.

0

Auf jeder neueren Version von SQL Server so einfach sein sollte:

with x as (
    select *, lag(dt) over(partition by an order by dt) dt_lag 
    from #temp 
) 
select *, datediff(day, dt_lag, dt) 
from x 
where datediff(day, dt_lag, dt) >= 10 
+0

Ich möchte aufeinander folgende Daten von nicht verwendet werden. wie für ein 7472381321 min Datum 2016-10-12 und maximales Datum ist 2016-10-14. Danach begann er am 2016-10-24 zu verwenden. also möchte ich keine Verwendungsdaten wie diese 7472381321 mindate 2016-10-15 und maxdate - 2016-10-23 und zählen: 8. –

+0

Entschuldigung, aber wie die anderen bereits kommentiert haben, stimmen Ihre Stichprobendaten und Ihre Erzählung nicht mit dem Stichprobenergebnis überein. – dean

Verwandte Themen