很简单但给分多的GROUP BY的问题,多谢大家

flashgod2002 2004-09-24 04:54:55
开始使用
SELECT ip FROM Visitor where (条件) group by ip
语句来统计一周时间内的不重复的来访IP地址数,没有问题

现在想改变为一周内以天为单位不重复的来访IP地址数

意思就是以前的统计是一周之内IP地址A访问都算一次
现在想改为IP地址A周一访问了3次,周二访问了1次,周五访问了4次,按照三次算

不知道该怎么写了

来访者的时间字段为“SDATE”

SELECT ip,sdate FROM Visitor where (条件) group by ip,sdate

好象不对吧
...全文
182 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2004-09-24
  • 打赏
  • 举报
回复
不知道有那里理解不对?
zjcxc 元老 2004-09-24
  • 打赏
  • 举报
回复
--如果sdate包含的时间信息

select count(*)
from(select distinct ip,sdate=convert(char(10),sdate,120) from 表)a

zjcxc 元老 2004-09-24
  • 打赏
  • 举报
回复
declare @t table(ip varchar(15),sdate datetime)
insert @t select '1.1.1.1','2004-9-20'
union all select '1.1.1.1','2004-9-20'
union all select '1.1.1.1','2004-9-22'
union all select '2.2.2.2','2004-9-20'
union all select '2.2.2.2','2004-9-24'

select count(*)
from(select distinct ip,sdate from @t)a

--结果:

-----------
4

(所影响的行数为 1 行)
flashgod2002 2004-09-24
  • 打赏
  • 举报
回复
不好意思,还是没解决

ip sdate
1.1.1.1 2004-9-20
1.1.1.1 2004-9-20
1.1.1.1 2004-9-22
2.2.2.2 2004-9-20
2.2.2.2 2004-9-24

我以前是本周内不管访问几次都算一个IP地址

所以这五条数据中我就统计出两个IP地址

而现在我要针对每天进行统计

1.1.1.1在2004-9-20 那天访问了两次,但只计算一次
加上2004-9-22 访问的1.1.1.1,一共是两次
加上2.2.2.2 两天的访问次数

所以是四次

其实说白了就是用DISTINCT IP周一统计一次,周二统计一次,周三统计一次,依次类推

一直统计到周日

全部之和

不知道这个需求是否可以用一个SQL语句实现

谢谢zjcxc(邹建)


flashgod2002 2004-09-24
  • 打赏
  • 举报
回复
谢谢您,真是专家啊

我已经知道怎么解决了

哈哈

zjcxc 元老 2004-09-24
  • 打赏
  • 举报
回复
如果你只要一个总计,则直接写为:
select count(*) from(select distinct ip,sdate from Visitor where (条件))a
zjcxc 元老 2004-09-24
  • 打赏
  • 举报
回复
我原来理解你是按周,一周的内访问过的ip都只算一次.
zjcxc 元老 2004-09-24
  • 打赏
  • 举报
回复

select ip,计数=count(distinct sdate)
from(
select ip='1.1.1.1',sdate='2004-9-20'
union all select '1.1.1.1','2004-9-20'
union all select '1.1.1.1','2004-9-22'
union all select '2.2.2.2','2004-9-20'
union all select '2.2.2.2','2004-9-24'
)a group by ip

/*--测试结果

ip 计数
------- -----------
1.1.1.1 2
2.2.2.2 2

(所影响的行数为 2 行)
--*/
zjcxc 元老 2004-09-24
  • 打赏
  • 举报
回复
可能我理解错了,你"现在想改变为一周内以天为单位不重复的来访IP地址数"

按你上面的数据,结果应该是??
1.1.1.1 2次
2.2.2.2 2次
zjcxc 元老 2004-09-24
  • 打赏
  • 举报
回复
怎么是4个?不是按IP分组吗?1.1.1.1总共才三条记录,怎么统计出四个来?
flashgod2002 2004-09-24
  • 打赏
  • 举报
回复
ip sdate
1.1.1.1 2004-9-20
1.1.1.1 2004-9-20
1.1.1.1 2004-9-22
2.2.2.2 2004-9-20
2.2.2.2 2004-9-24

按照我开是的统计

本周的IP访问肯定是2个

但我现在要改成访问数为4个

2004-9-20当天的1.1.1.1就按照一次算

而2004-9-22的1.1.1.1又按照一次算

以前的算法那肯定是把一周的1.1.1.1都算一次

谢谢谢谢!:)
skyfine 2004-09-24
  • 打赏
  • 举报
回复
SQL刚学,代码写不出来.按楼主的要求,可以把日期中时间部分去掉,然后按用户和时间排序不是每一天都只算一个了。
zjcxc 元老 2004-09-24
  • 打赏
  • 举报
回复
最好举数据实例说明一下,你这样说反而看得不是很明白了.
flashgod2002 2004-09-24
  • 打赏
  • 举报
回复
谢谢zjcxc(邹建)

你很专业

不过按照你这个算法

和我

“开始使用
SELECT ip FROM Visitor where (条件) group by ip
语句来统计一周时间内的不重复的来访IP地址数,没有问题”

得出的数值是一样的

还是按照周来过滤的IP地址,也就是说IP地址A一周内不同天无论访问几次都按照一次算

我的那个(条件)就是

SDate>DATEADD(day,-"&monday&",'"&today&"') and SDate<DATEADD(day,"&sunday&",'"&today&"')

用来控制只访问本周的数据

是不是我有问题呢
zjcxc 元老 2004-09-24
  • 打赏
  • 举报
回复
--上面少写了日期
select ip,count(distinct dt) from(
select ip,dt=datepart(week,sdate) from Visitor where (条件)
) a group by ip


--如果楼主的周是以周一做为一周的开始,则改用:

select ip,count(distinct dt) from(
select ip,dt=datepart(week,sdate-1) from Visitor where (条件)
) a group by ip
zjcxc 元老 2004-09-24
  • 打赏
  • 举报
回复
select ip,count(distinct dt) from(
select ip,dt=datepart(week) from Visitor where (条件)
) a group by ip
yujohny 2004-09-24
  • 打赏
  • 举报
回复
selct ip,count(*) 次数 from
(SELECT distinct ip,sdate FROM Visitor where (条件)) a
group by ip
leeboyan 2004-09-24
  • 打赏
  • 举报
回复
select ip,count(ip),datepart(day,sdate) FROM Visitor where (条件) group by ip,datepart(day,sdate)
yujohny 2004-09-24
  • 打赏
  • 举报
回复
selct ip,count(*) 次数 from
(SELECT distinct ip,sdate FROM Visitor where (条件))
group by ip
leeboyan 2004-09-24
  • 打赏
  • 举报
回复
select ip,count(ip),datepart(day,sdate) FROM Visitor where (条件) group by ip,datepart(day,sdate)

34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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