计算sql中聚合计数的百分比

gcmastyq  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(367)

我有一个名为 AccessLog 每次用户在我的网站上点击“登录”时都会插入。重要的领域是 UserID , BrowserName 以及 Date . 这样做的目的是了解哪些浏览器是访问站点最多的浏览器。
以下是一个示例数据集:

| UserID | BrowserName | Date  |
|--------|-------------|-------|
| 1      | Chrome      | 05/28 |
| 1      | Chrome      | 05/29 |
| 2      | Firefox     | 05/29 |
| 1      | Chrome      | 05/30 |
| 3      | Firefox     | 05/31 |

这是我使用的sql代码(可在此处找到):

SELECT BrowserName
    ,(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER ()) pct
    ,COUNT(*) ct
FROM AccessLog
GROUP BY BrowserName

以下是我通过该查询得到的结果:

| BrowserName | pct  | ct |
|-------------|------|----|
| Chrome      | 60.0 | 3  |
| Firefox     | 40.0 | 2  |

但这些是我想要的结果:

| BrowserName | pct  | ct |
|-------------|------|----|
| Chrome      | 33.3 | 1  |
| Firefox     | 66.6 | 2  |

如何修改查询以对每个不同的查询进行计数 UserID 以及 BrowserName 配对一次,不要人为地增加计数?

o4tp2gmn

o4tp2gmn1#

您可以通过创建 cte . 这是演示。

with total_users as
(
    select
      BrowserName,
      count(distinct UserId) as total_users
    from myTable
    group by
      BrowserName
)    
select 
    BrowserName,
    round((total_users * 100.0)/sum(total_users) over (), 1) as pct,
    total_users as ct
from total_users

输出:

| browsername | pct   | ct  |
| ----------- | ----- | --- |
| Chrome      | 33.3  | 1   |
| Firefox     | 66.6  | 2   |
5uzkadbs

5uzkadbs2#

你想用 count(distinct) . 但在SQLServer中,直接作为窗口函数是不可能的。所以使用 dense_rank() 技巧:

SELECT BrowserName,
       (COUNT(DISTINCT UserId) * 100.0 /
        (DENSE_RANK() OVER (ORDER BY UserId ASC) +
         DENSE_RANK() OVER (ORDER BY UserId DESC)
        )
       ) as pct,
      COUNT(DISTINCT UserId) as ct
FROM AccessLog
GROUP BY BrowserName

相关问题