我有一个名为AccessLog
的SQL Server表,每次用户单击我的网站上的“登录”时都会插入该表。重要字段是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代码(找到here):
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
分别计数一次,而不是人为地增加计数?
答案 0 :(得分:1)
您可以通过创建cte
来尝试以下操作。这是demo。
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 |
答案 1 :(得分:0)
您要使用count(distinct)
。但这不可能作为窗口函数直接在SQL Server中实现。因此,请使用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