我有一个如下表:
活动表:
+---------+------------+---------------+---------------+
| user_id | session_id | activity_date | activity_type |
+---------+------------+---------------+---------------+
| 1 | 1 | 2019-07-21 | open_session |
| 1 | 1 | 2019-07-21 | scroll_down |
| 1 | 1 | 2019-07-21 | end_session |
| 2 | 4 | 2019-07-21 | open_session |
| 2 | 4 | 2019-07-22 | send_message |
| 2 | 4 | 2019-07-22 | end_session |
| 3 | 2 | 2019-07-22 | open_session |
| 3 | 2 | 2019-07-22 | send_message |
| 3 | 2 | 2019-07-22 | end_session |
| 3 | 5 | 2019-07-22 | open_session |
| 3 | 5 | 2019-07-22 | scroll_down |
| 3 | 5 | 2019-07-22 | end_session |
| 4 | 3 | 2019-06-20 | open_session |
| 4 | 3 | 2019-06-20 | end_session |
+---------+------------+---------------+---------------+
我正在计算截至2019年7月28日的30天内每个用户的平均会话数。我正在SQL Server中解决此问题。
我的查询是
SELECT
ROUND(COUNT(DISTINCT(session_id))/COUNT(DISTINCT(user_id)) ,2 ) average_sessions_per_user
FROM Activity
WHERE activity_date >= DATEADD(day, -30, 2019-07-27)
输出返回1。正确的输出应为1.33。
我不知道为什么我的输出为1。如果我分别检查COUNT(DISTINCT(session_id))
和COUNT(DISTINCT(user_id))
的输出,则返回值为4和3,这是正确的。但是,一旦像上面的查询一样对它们进行划分,它就无法正常工作。
COUNT
返回一个整数,因此将两个COUNT
值相除是一个整数除法,这将返回一个整数。将乘数乘以1.0将得出操作浮点,然后返回预期结果:SELECT
ROUND(1.0*COUNT(DISTINCT(session_id))/COUNT(DISTINCT(user_id)) ,2 ) average_sessions_per_user
FROM Activity
WHERE activity_date >= DATEADD(day, -30, 2019-07-27)
Demo on SQLFiddle