【问题标题】:Count distinct values in one column provided the 2nd column value is not the same in SQL如果 SQL 中的第二列值不同,则计算一列中的不同值
【发布时间】:2018-08-20 17:01:19
【问题描述】:

我有一个数据库,其中有多个列。如果这些页面上的时间戳不同,我正在尝试查找访问过的 不同 网页。例如:

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 最终会再次出现,它不应该算在内,因为用户之前已经访问过。任何帮助将不胜感激。

【问题讨论】:

  • 您使用的是哪个 RDBMS?
  • 我正在使用 ssms

标签: sql sql-server count


【解决方案1】:

这是使用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),但同样不知道为什么。

【讨论】:

  • 哦,抱歉,所以“SNO”无关紧要。如果时间戳不同,我只需要计算不同的页面。
【解决方案2】:

您可以通过简单的 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;

结果相同。

【讨论】:

    【解决方案3】:

    你可以使用排名功能

    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
    

    【讨论】:

      猜你喜欢
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      • 2023-03-08
      • 2021-09-25
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多