SQL 2005 SQL查询问题,望大神不吝指教

火影-信念 2013-07-04 02:28:42
有一个签到功能,每天每个手机号码只能签到一次,
现在需要查询指定手机号码连续三天签到和累计五天签到怎么查询吖,
求大神不吝指教

...全文
318 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
火影-信念 2013-07-05
  • 打赏
  • 举报
回复
引用 14 楼 maco_wang 的回复:
感谢叶子斑竹侠赐教,也感谢xiaoqi7456耐心赐教
xiaoqi7456 2013-07-04
  • 打赏
  • 举报
回复
更正语法错误: 连续3天:

SELECT DISTINCT phone,0 AS ncs INTO #2 FROM #t
DECLARE @endtime datetime
DECLARE @begintime datetime
select @endtime = max(gettime) FROM #t
PRINT @endtime
SELECT @begintime= min(gettime) FROM #t
WHILE @begintime<=@endtime
BEGIN
	
	UPDATE a SET a.ncs=CASE WHEN  a.phone IN(SELECT phone
	FROM #t WHERE gettime=@begintime )  THEN ncs+1 
	WHEN a.ncs=3 THEN 3 ELSE 0 END
	FROM #2 a 
	SET @begintime=@begintime+1
END

SELECT * FROM #2 WHERE ncs>=3
叶子 2013-07-04
  • 打赏
  • 举报
回复
引用 7 楼 smallmoved 的回复:
[quote=引用 6 楼 maco_wang 的回复:] 楼主问题解决了吗?
还未能解决,请不吝赐教[/quote]

--> 测试数据:@t (模拟了15条数据)
declare @t table(id varchar(2),Phone varchar(11),GetTime datetime)
insert @t
select '1','13100000000','2013-07-01' union all
select '2','13100000000','2013-07-02' union all
select '3','13100000000','2013-07-04' union all
select '4','13100000001','2013-07-01' union all
select '5','13100000001','2013-07-02' union all
select '6','13100000001','2013-07-03' union all
select '7','13100000003','2013-07-05' union all
select '8','13100000003','2013-07-02' union all
select '9','13100000002','2013-07-01' union all
select '10','13100000002','2013-07-01' union all
select '11','13100000002','2013-07-02' union all
select '12','13100000002','2013-07-03' union all
select '13','13100000003','2013-07-01' union all
select '14','13100000003','2013-07-04' union all
select '15','13100000003','2013-07-06'

--累计5条的
select Phone from @t group by Phone having(count(*)>=5)
/*
手机
-----------
13100000003
*/
--连续3天的
;with maco as
(
select *,
ROW_NUMBER() over (partition by Phone order by GetTime) as rid,cast(GetTime-(select min(GetTime) from @t)+1 as int) as cnt
from @t
)
select Phone from maco group by Phone,cnt-rid having(count(*)>=3)
/*
Phone
-----------
13100000002
13100000001
13100000003
*/
xiaoqi7456 2013-07-04
  • 打赏
  • 举报
回复
#2 是临时表。。。 额。。如果你这个都不太懂。。我估计我写的你也不太明白。。 你最好还是看点基础书吧
引用 12 楼 smallmoved 的回复:
[quote=引用 11 楼 xiaoqi7456 的回复:] [quote=引用 10 楼 smallmoved 的回复:] [quote=引用 7 楼 smallmoved 的回复:] [quote=引用 6 楼 maco_wang 的回复:] 楼主问题解决了吗?
还未能解决,请不吝赐教[/quote] 还望可以加下QQ指教一番:1842989293[/quote] 我是给这个表加了一列 次数,用语记录后面的连续次数, 不好意思,工作中,不能用Q,你有问题可以留言帖子,我得空了会关注你的问题的[/quote] 连续3天:SELECT DISTINCT phone,0 AS ncs INTO #2 FROM tb INTO 后面#2代表什么? tb应该是我要查询的表 [/quote]
火影-信念 2013-07-04
  • 打赏
  • 举报
回复
引用 11 楼 xiaoqi7456 的回复:
[quote=引用 10 楼 smallmoved 的回复:] [quote=引用 7 楼 smallmoved 的回复:] [quote=引用 6 楼 maco_wang 的回复:] 楼主问题解决了吗?
还未能解决,请不吝赐教[/quote] 还望可以加下QQ指教一番:1842989293[/quote] 我是给这个表加了一列 次数,用语记录后面的连续次数, 不好意思,工作中,不能用Q,你有问题可以留言帖子,我得空了会关注你的问题的[/quote] 连续3天:SELECT DISTINCT phone,0 AS ncs INTO #2 FROM tb INTO 后面#2代表什么? tb应该是我要查询的表
xiaoqi7456 2013-07-04
  • 打赏
  • 举报
回复
引用 10 楼 smallmoved 的回复:
[quote=引用 7 楼 smallmoved 的回复:] [quote=引用 6 楼 maco_wang 的回复:] 楼主问题解决了吗?
还未能解决,请不吝赐教[/quote] 还望可以加下QQ指教一番:1842989293[/quote] 我是给这个表加了一列 次数,用语记录后面的连续次数, 不好意思,工作中,不能用Q,你有问题可以留言帖子,我得空了会关注你的问题的
火影-信念 2013-07-04
  • 打赏
  • 举报
回复
引用 7 楼 smallmoved 的回复:
[quote=引用 6 楼 maco_wang 的回复:] 楼主问题解决了吗?
还未能解决,请不吝赐教[/quote] 还望可以加下QQ指教一番:1842989293
火影-信念 2013-07-04
  • 打赏
  • 举报
回复
[quote=引用 8 楼 xiaoqi7456 的回复:] 连续3天:SELECT DISTINCT phone,0 AS ncs INTO #2 FROM tb DECLARE @endtime datetime DECLARE @begintime datetime select @endtime = max(gettime) FROM tb SELECT @begintime= min(gettime) FROM tb WHILE @begintime<@begintime BEGIN UPDATE a SET a.ncs=CASE WHEN a.sspbh IN(SELECT sspbh FROM tb WHERE gettime=@begintime ) AND THEN ncs+1 WHEN a.ncs=3 THEN 3 ELSE 0 END FROM #2 a SET @begintime=@begintime+1 END SELECT * FROM #2 WHERE ncs>=3 累计5天: select phone ,count(1) from tb group by phone having count(1)>=5 连续3天:SELECT DISTINCT phone,0 AS ncs INTO #2 FROM tb phone后面字段0是什么?
xiaoqi7456 2013-07-04
  • 打赏
  • 举报
回复
连续3天:SELECT DISTINCT phone,0 AS ncs INTO #2 FROM tb DECLARE @endtime datetime DECLARE @begintime datetime select @endtime = max(gettime) FROM tb SELECT @begintime= min(gettime) FROM tb WHILE @begintime<@begintime BEGIN UPDATE a SET a.ncs=CASE WHEN a.sspbh IN(SELECT sspbh FROM tb WHERE gettime=@begintime ) AND THEN ncs+1 WHEN a.ncs=3 THEN 3 ELSE 0 END FROM #2 a SET @begintime=@begintime+1 END SELECT * FROM #2 WHERE ncs>=3 累计5天: select phone ,count(1) from tb group by phone having count(1)>=5
引用 7 楼 smallmoved 的回复:
[quote=引用 6 楼 maco_wang 的回复:] 楼主问题解决了吗?
还未能解决,请不吝赐教[/quote]
火影-信念 2013-07-04
  • 打赏
  • 举报
回复
引用 6 楼 maco_wang 的回复:
楼主问题解决了吗?
还未能解决,请不吝赐教
叶子 2013-07-04
  • 打赏
  • 举报
回复
楼主问题解决了吗?
火影-信念 2013-07-04
  • 打赏
  • 举报
回复
引用 4 楼 xiaoqi7456 的回复:
引用 3 楼 smallmoved 的回复:
[quote=引用 2 楼 xiaoqi7456 的回复:] 累计5天:根据查询的时间段,手机号码,groupby 一把 count数,等于5的就是的 连续3天:天数不多的话做个循环,手机号码,日期循环,存在加1,不存在清0,循环得到大于等于3的就是的 [quote=引用 1 楼 smallmoved 的回复:]
表设计很简单: ID 手机 签到时间 id Phone GetTime 逻辑我懂,但语法不知怎样写,求指教[/quote] 你需要告诉我你要查什么时间段内的累计时间和连续时间[/quote] 签到活动时间:2013-07-01 至2013-07-14
xiaoqi7456 2013-07-04
  • 打赏
  • 举报
回复
引用 3 楼 smallmoved 的回复:
引用 2 楼 xiaoqi7456 的回复:
累计5天:根据查询的时间段,手机号码,groupby 一把 count数,等于5的就是的 连续3天:天数不多的话做个循环,手机号码,日期循环,存在加1,不存在清0,循环得到大于等于3的就是的 [quote=引用 1 楼 smallmoved 的回复:]
表设计很简单: ID 手机 签到时间 id Phone GetTime 逻辑我懂,但语法不知怎样写,求指教[/quote] 你需要告诉我你要查什么时间段内的累计时间和连续时间
火影-信念 2013-07-04
  • 打赏
  • 举报
回复
引用 2 楼 xiaoqi7456 的回复:
累计5天:根据查询的时间段,手机号码,groupby 一把 count数,等于5的就是的 连续3天:天数不多的话做个循环,手机号码,日期循环,存在加1,不存在清0,循环得到大于等于3的就是的
引用 1 楼 smallmoved 的回复:
表设计很简单: ID 手机 签到时间 id Phone GetTime 逻辑我懂,但语法不知怎样写,求指教
xiaoqi7456 2013-07-04
  • 打赏
  • 举报
回复
累计5天:根据查询的时间段,手机号码,groupby 一把 count数,等于5的就是的 连续3天:天数不多的话做个循环,手机号码,日期循环,存在加1,不存在清0,循环得到大于等于3的就是的
引用 1 楼 smallmoved 的回复:
火影-信念 2013-07-04
  • 打赏
  • 举报
回复

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧