2010-12-15 8 views
0

i eine TabelleFinden Sie Differenz zwischen Enddaten durch den Vergleich Reihen

---------- 
User 
---------- 
userID(pk) 
startdate // update : i am not using this field. 
enddate 

i zwischen dem end_dates zwischen den Zeilen vergleichen muß zu vergleichen, ob es mehr als 3 Tage sind und der Benutzer-ID zählen.

i ähnlich etwas tue zu diesem

WHILE @@FETCH_STATUS = 0 
BEGIN 

    select @lastrowID = max(rowid) from @User 
    if (@userid = (select userId from @User where rowid = @lastRowID)) 
    begin 
     update @User set NextEndDate= @endDate where rowid = @lastRowID and userid = @userid 
    end 
    else 
    begin 
     insert @UserTable (userid, EndDate,NextEndDate) values (@userid, @endDate,@NextEndDate) 
    end 
END 

meine Idee ist, um den Tisch zu Schleife und erstellen Sie ein Weiterende Datum und dann den Vergleich mit datediff finden. Ich bin mit dem ersten Teil des Nextend-Datums fest und ich glaube, der zweite Teil des Vergleichs wäre einfach. Ich stecke dazwischen.

meine frage ist ich mache das richtige, es wird ziemlich kompliziert. Ich bin verwirrt, ob das Ergebnis über SQL-Abfrage erhalten oder verwenden Sie C# bei Code hinter Linq oder etwas ähnliches.

aktualisieren: Sorry, wenn ich bei der Erklärung meines Szenarios nicht klar war: Ich versuche, die Zählung zu finden, nicht wie oft ein Kunde besucht hat. Beispiel: Benutzer-ID: 1 haben können besucht täglich oder einmal im Monat. also muss ich die Zählung bekommen (Häufigkeit des Benutzerbesuchs). so, wenn die Benutzer Enddatum besucht war

userid  enddate 
1   1/1/2010 
1   1/2/2010 count 1 
1   1/10/2010 count 2 difference is more than 3 days 
1   1/13/2010 count 2 (because diff is less than 3 days) 

das ist, wie ich zählen sollte, das ist yi versuchte Cursor zu verwenden, die zu erschweren wurde für mich zu lösen. Ich schätze für Ihre Führung.

+0

Welche Version von SQL Server? – Donnie

+0

Ich sehe Sie nirgends in dieser Cursorschleife zählen. Kannst du klar erklären, was du versuchst zu bekommen? Es könnte sehr gut möglich sein, dies ohne einen Cursor zu tun. – cdonner

+0

Version SQL Server 2008. @ Cdonner Ich bin im ersten Teil der Erstellung eines Nextenddate stecken, so dass ich mit dem Nextenddate und Enddatum in der gleichen Zeile vergleichen konnte. Wenn ich dieses Ergebnis richtig verstehe, würde ich den nächsten Teil durch Vergleichen zählen, aber ich möchte wirklich nicht Cursor verwenden. Gibt es einen anderen Weg? Vielen Dank. – jero

Antwort

1

Ok, ich verstehe dein Problem jetzt. Ich weiß, dass es eine bessere Möglichkeit gibt, dies in SQL zu tun, vielleicht mit CTEs, aber diese Lösung sollte funktionieren und keine Cursor verwenden. Dadurch erhalten Sie eine vollständige Tabelle mit dem Da tiff des vorherigen Enddatums (falls zutreffend). Sie können dann basierend auf dem Datingiff auswählen.

select u1.*, datediff(day, u2.enddate, u1.enddate) as days from 
    (
    select userid, enddate, row_number() over(partition by userid order by userid, enddate) as rownumber 
    from [user] 
    ) u1 
    left join 
    (
    select userid, enddate, row_number() over(partition by userid order by userid, enddate) as rownumber 
    from [user] 
    )u2 
    on u1.userid = u2.userid 
    and u1.rownumber = u2.rownumber + 1 
+0

danke jlnorsworthy, ich habe meine Frage aktualisiert, mein Szenario zu erklären. Ich muss für jede Zeile berechnen und nicht die Min und Max für den bestimmten Benutzer nehmen. – jero

+0

Ok, ich bekomme es jetzt ... es kann sicherlich in SQL gemacht werden, ich muss meine SQL-Rezepte Buch zu brechen :) (ein SQL-Guru könnte aber leicht beantworten) – jlnorsworthy

+0

Ur Awesome Man ... danke. – jero

0

EDIT

declare @table table (userid int, startdate datetime, enddate datetime) 

insert into @table (userid, startdate, enddate) values (1, '01-JAN-2010', '2-JAN-2010') 
insert into @table (userid, startdate, enddate) values (2, '01-JAN-2010', '3-JAN-2010') 
insert into @table (userid, startdate, enddate) values (3, '01-JAN-2010', '4-JAN-2010') 
insert into @table (userid, startdate, enddate) values (4, '01-JAN-2010', '5-JAN-2010') 
insert into @table (userid, startdate, enddate) values (5, '01-JAN-2010', '6-JAN-2010') 
insert into @table (userid, startdate, enddate) values (6, '01-JAN-2010', '7-JAN-2010') 
insert into @table (userid, startdate, enddate) values (7, '01-JAN-2010', '8-JAN-2010') 

select SUM(yn) as dueinmorethanthreedays from 
    (select 
    (case when DATEADD(day,3,startdate) < enddate then 1 else 0 end) as yn 
    from @table 
) as derived 

Eine Unterabfrage, die für jede Zeile 1 zurückkehrt, wo das Startdatum weniger als drei Tage der enddate (und sonst 0) kann summiert werden, um die insgesamt zu erhalten.

+0

danke amelvin, aber ich benutze nicht Startdatum, ich muss zwischen Enddaten jeder Zeile für die spezifische Benutzer-ID vergleichen. – jero

Verwandte Themen