2010-12-15 62 views
0

我有一個表通過比較行

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

我需要比較各行之間的end_dates之間比較其是否超過3天,算用戶ID查找結束日期之間的差異。

我這樣做與此類似

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 

我的想法的東西是圍着桌子環路,並創建一個下一頁末頁日期,然後找到使用DATEDIFF比較。我堅持創建nextend日期的第一部分,我相信比較的第二部分很容易。我陷入了兩者之間。

我的問題是我做正確的事情,它變得相當複雜。 我很困惑是否通過sql查詢得到結果,或者在使用Linq或類似的代碼背後使用C#。

更新: 抱歉如果我不清楚在解釋我的情況:我正在嘗試查找客戶已訪問的次數。 ex: userid:1有可能每天或一個月訪問一次。所以我需要得到計數(用戶訪問的頻率)。因此,如果用戶訪問結束日期是

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) 

,這是我應該怎麼算,這就是我Ÿ嘗試使用光標它太複雜,我來解決。我很感激你的指導。

+0

什麼版本的sql server? – Donnie 2010-12-15 00:36:35

+0

我沒有看到你在這個遊標循環中的任何地方計數。你能清楚地解釋你試圖得到什麼嗎?如果沒有遊標,很可能會有這種方法。 – cdonner 2010-12-15 00:46:31

+0

版本SQL服務器2008. @cdonner我被困在創建nextenddate的第一部分,以便我可以與同一行中的nextenddate和enddate進行比較。如果我得到這個結果的權利,下一部分我會通過比較來計算,但我真的不想使用光標。有沒有其他方法。謝謝。 – jero 2010-12-15 04:55:57

回答

1

好吧,我現在明白你的問題了。我知道有一種更好的方法可以在SQL中執行此操作,也許可以使用CTE,但是此解決方案應該可以工作並且不會使用遊標。這會給你一個完整的表格,其中包含前一個結束日期(如適用)。然後您可以基於datediff從中進行選擇。

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

感謝jlnorsworthy,我已經更新了我的問題,解釋了我的情況。我需要爲每一行計算,而不是採用特定用戶的最小值和最大值。 – jero 2010-12-15 06:06:06

+0

好吧,我現在得到它...它當然可以在SQL中完成,我將不得不破壞我的SQL食譜書:)(一個SQL大師可以輕鬆回答,雖然) – jlnorsworthy 2010-12-15 06:16:43

+0

你真棒男人......謝謝。 – jero 2010-12-15 14:19:14

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 

這對於其中開始日期是結束日期的不到三天(否則爲0)可以被求和,以獲得總的每一行返回1的子查詢。

+0

感謝amelvin但我沒有使用startdate,我需要比較特定用戶標識的每一行的結束日期。 – jero 2010-12-15 04:58:01