如果第二列值在SQL中不相同,则计算一列中的不同值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果第二列值在SQL中不相同,则计算一列中的不同值相关的知识,希望对你有一定的参考价值。

我有一个数据库,其中有多列。我试图找到访问过的不同网页,前提是这些页面上的时间戳不一样。例如:

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

谷歌和雅虎有相同的时间戳,所以它应该算作1页访问而不是2,类似的insta和twitter有相同的时间戳,所以也应该算作1.另外,因为bing最后再来,它不应该算因为用户之前已经访问过。任何帮助将不胜感激。

答案

这里有一个选项使用row_number来获取用户访问的每个页面的第一个实例,然后你可以使用countdistinct来获得你需要的总数,但是我不明白你为什么要返回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),但再次,不知道为什么。

另一答案

你可以用一个简单的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;

结果相同。

另一答案

你可以使用等级功能

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

以上是关于如果第二列值在SQL中不相同,则计算一列中的不同值的主要内容,如果未能解决你的问题,请参考以下文章

SQL - 计算一个列值在另一列中的出现

SQL如何查询出某一列中不同值出现的次数?

如何用第二列值替换星号

Sql Server 查询,一共三列,怎样查出第一个列值相同,第二列值最大的第三列的值?

根据第一列中的唯一值计算第二列中值的出现次数

EXCEL如何把第二列的数据按照第一列数据排序,且第二列的数据少于第一列?