SQL - Выполнение дополнительных математических вычислений для результатов, полученных из агрегатных функций в запросе - PullRequest
0 голосов
/ 07 марта 2020

Я довольно новичок в написании SQL запросов. Я использовал подзапрос, чтобы получить результаты агрегатных функций, примененных к 2 различным таблицам. Кроме того, я хотел бы получить соотношение между результатами этих двух агрегатных функций. Другими словами, Результат Агрегатной функции 1 / Результат Агрегатной функции 2.

ВВОД: ПОЛЬЗОВАТЕЛИ ТАБЛИЦЫ

Id                             
1                                 
2                                 
3  
4  
5   
6  
7 

СТОЛОВЫЕ СОБЫТИЯ

User_Id         Event_Name  
1            View_User_Profile  
1            View_User_Activity  
1            View_User_Profile  
2            View_User_Activity  
3            View_User_Activity  
4            View_User_Profile  
5            View_User_Activity  
7            View_User_Activity 

Это мой код на данный момент:

SELECT COUNT(*) AS Number_of_Users, 
    (SELECT COUNT(DISTINCT U.Id) AS Number_of_Users_Viewed_Profile
    FROM dsv1069.Users U Left Join dsv1069.Events E
    ON U.Id = E.user_id
    WHERE E.Event_Name = 'view_user_profile') AS Number_of_Users_Viewed_Profile
FROM dsv1069.Users

РЕЗУЛЬТАТЫ:

Number_of_Users: 7
Number_of_Users_Viewed_Profile: 2

ОЖИДАЕМЫЙ ВЫХОД:

Number_of_Users: 7
Number_of_Users_Viewed_Profile: 2
PERCENT OF USERS VIEWED PROFILE: 28.6%


ВЫПУСК: Что мой код до сих пор не делает, это вычислить соотношение 2/7 = 28,6%. Я сделал много поисков по агрегатным функциям, но не могу найти никакой информации о том, как использовать результаты этих функций как часть запроса. Спасибо за любую помощь!

1 Ответ

0 голосов
/ 08 марта 2020

Я считаю, что вы можете получить столбец Number_of_Users_Viewed_Profile без объединения:

SELECT COUNT(DISTINCT user_id) 
FROM dsv1069.Events 
WHERE Event_Name = 'view_user_profile'

Так что это эквивалентно вашему запросу:

SELECT 
  COUNT(*) AS Number_of_Users, 
  (
    SELECT COUNT(DISTINCT user_id) 
    FROM dsv1069.Events 
    WHERE Event_Name = 'View_User_Profile'
  ) AS Number_of_Users_Viewed_Profile 
FROM dsv1069.Users

Вы можете получить ratio столбец с CTE:

WITH cte AS (
  SELECT 
    COUNT(*) AS Number_of_Users, 
    (
      SELECT COUNT(DISTINCT user_id) 
      FROM Events 
      WHERE Event_Name = 'View_User_Profile'
    ) AS Number_of_Users_Viewed_Profile 
  FROM Users
)
SELECT *, ROUND(100.0 * Number_of_Users_Viewed_Profile / Number_of_Users, 1) AS ratio
FROM cte

См. демоверсию . Или без CTE:

SELECT
  t1.Number_of_Users,
  t2.Number_of_Users_Viewed_Profile,
  ROUND(100.0 * t2.Number_of_Users_Viewed_Profile / t1.Number_of_Users, 1) AS ratio
FROM (SELECT COUNT(*) AS Number_of_Users FROM Users) AS t1
CROSS JOIN (
  SELECT COUNT(DISTINCT user_id) AS Number_of_Users_Viewed_Profile 
  FROM Events 
  WHERE Event_Name = 'View_User_Profile'
) AS t2 

См. Демоверсию . Результаты:

| Number_of_Users | Number_of_Users_Viewed_Profile | ratio |
| --------------- | ------------------------------ | ----- |
| 7               | 2                              | 28.6  |
...