SQL 计算小数平均值而不是整数
SQL Calculating decimal average instead of int
我有一个 table 如下所示:
Activity table:
+---------+------------+---------------+---------------+
| 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-07-28 的 30 天内每个用户的平均会话数。我正在 SQL 服务器中解决这个问题。
我的查询是
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)
输出returns 1.正确的输出应该是1.33。
我不明白为什么我的输出是 1。如果我分别检查 COUNT(DISTINCT(session_id))
和 COUNT(DISTINCT(user_id))
的输出,returns 是 4 和 3,这是正确的。但是,一旦我像上面的查询那样划分它们,它就无法正常工作。
你的问题是 COUNT
return 是一个整数,所以将两个 COUNT
值相除是一个整数除法,这将 return 一个整数。加上乘以 1.0 使操作浮点,然后 returns 预期结果:
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')
另请注意,DATEADD
中的日期需要用引号引起来(请参阅上面的查询和演示)。
我有一个 table 如下所示:
Activity table:
+---------+------------+---------------+---------------+
| 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-07-28 的 30 天内每个用户的平均会话数。我正在 SQL 服务器中解决这个问题。
我的查询是
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)
输出returns 1.正确的输出应该是1.33。
我不明白为什么我的输出是 1。如果我分别检查 COUNT(DISTINCT(session_id))
和 COUNT(DISTINCT(user_id))
的输出,returns 是 4 和 3,这是正确的。但是,一旦我像上面的查询那样划分它们,它就无法正常工作。
你的问题是 COUNT
return 是一个整数,所以将两个 COUNT
值相除是一个整数除法,这将 return 一个整数。加上乘以 1.0 使操作浮点,然后 returns 预期结果:
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')
另请注意,DATEADD
中的日期需要用引号引起来(请参阅上面的查询和演示)。