我有一个数据库,其中有多个列。我试图找到访问的与众不同网页,只要这些网页上的时间戳不同即可。例如:
Sno User Page Timestamp
1 A google 18.00
2 A yahoo 18.00
3 A bing 19.00
4 A facebook 20.00
5 A insta 21.00
6 A twitter 21.00
7 A bing 22.00
结果应该是:
User Count
A 4
Google和yahoo具有相同的时间戳,因此应将其视为已访问的1页,而不是2;同样,insta和twitter具有相同的时间戳,因此也应计为1。而且,由于bing最终再次出现,因此不应该将其视为用户已经访问过的网站。任何帮助将不胜感激。
答案 0 :(得分:0)
您可以使用排名功能
select User_, count(distinct timestamp) as count
from (
select *, rank() over (partition by User_, page order by timestamp) grp
from t
) t1
where grp = 1
group by User_
http://sqlfiddle.com/#!18/31979/6
User_ count
A 4
答案 1 :(得分:0)
这是一个使用row_number
来获取用户访问的每个页面的第一个实例的选项,然后可以将count
和distinct
一起使用来获取所需的总数,但是我我不明白为什么要返回sno = 1
:
select user, count(distinct timestamp)
from (
select *, row_number() over (partition by user, page order by timestamp) rn
from yourtable
) t
where rn = 1
group by user
如果您需要sno = 1
,则可以使用min(sno)
,但是同样,不确定原因。
答案 2 :(得分:0)
您可以通过简单的CTE做到这一点。假设数据是:
create table t1 (
sno int,
usr varchar(10),
page varchar(10),
ts int
);
insert into t1 (sno, usr, page, ts) values (1, 'A', 'google', 18);
insert into t1 (sno, usr, page, ts) values (2, 'A', 'yahoo', 18);
insert into t1 (sno, usr, page, ts) values (3, 'A', 'bing', 19);
insert into t1 (sno, usr, page, ts) values (4, 'A', 'facebook', 20);
insert into t1 (sno, usr, page, ts) values (5, 'A', 'insta', 21);
insert into t1 (sno, usr, page, ts) values (6, 'A', 'twitter', 21);
insert into t1 (sno, usr, page, ts) values (7, 'A', 'bing', 22);
查询可能是:
with g (p, c) as (
select max(page), count(*)
from t1
group by ts
)
select count(distinct p) as my_count from g;
结果:
my_count
--------
4
或者...您也可以这样做:
select count(distinct p) from (
select max(page) as p, count(*) as c
from t1
group by ts
) x;
具有相同的结果。