我有一张桌子
----------
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
我的想法是围绕表格并创建一个nextend日期,然后使用datediff找到比较。我坚持创建nextend日期的第一部分,我相信比较的第二部分会很容易。我被困在中间。
我的问题是我做的是正确的事,它变得非常复杂。 我很困惑是通过SQL查询得到结果还是在使用Linq或类似代码的代码后使用C#。
更新: 对不起,如果我不清楚解释我的情景:我正在试图找到计数,客户访问的次数。 例如: 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 :(得分:1)
好的,我现在明白你的问题。我知道有一种更好的方法可以在SQL中执行此操作,可能使用CTE,但此解决方案应该可以使用并且不使用游标。这将为您提供一个完整的表格,其中包含前一个结束日期(如适用)。然后,您可以根据日期来选择它。
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
答案 1 :(得分:0)
修改强>
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
一个子查询为每一行返回1,其中startdate小于enddate的三天(否则为0)可以相加得到总数。