2010-12-15 104 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