计算CTE用户的百分比

时间:2017-02-11 22:44:48

标签: postgresql

我有2个CTE。第一个计算用户数。第二个做同样的事情。有必要计算它们之间的百分比。

提示如何做到这一点?

WITH count AS ( SELECT user_id
                        from users u
                          where u.status = 'Over'),
users as (Select user_id
                from users u
                  where u.status LIKE 'LR'
                  and user_id IN (select * from count))
Select COUNT(*) From users


WITH count AS ( SELECT user_id
                        from users u
                          where u.description = 'Track'),
users as (Select user_id
                from from users u
                  where u.status NOT LIKE 'LR'
                  and user_id IN (select * from count))
Select COUNT(*) From users

3 个答案:

答案 0 :(得分:2)

你可以在没有CTE的情况下完成,只需简单选择2个计数:

SELECT count( CASE WHEN description = 'Over' AND status LIKE 'LR' THEN 1 END )
       /
       count( CASE WHEN description = 'Track' AND status NOT LIKE 'LR' THEN 1 END )    
       As Ratio
FROM users   

答案 1 :(得分:1)

只需做一点改动,你就可以做一个更大的CTE:

WITH count_1 AS 
( 
  SELECT user_id
  FROM users u
  WHERE u.status = 'Over'
),
users_1 AS 
(
  SELECT user_id
  FROM   users u
  WHERE  u.status LIKE 'LR'
        AND user_id IN (SELECT user_id FROM count_1)
),
count_2 AS 
(   
  SELECT user_id
  FROM users u
  WHERE u.description = 'Track'
),
users_2 AS 
(
  SELECT  user_id
  FROM users u
  WHERE u.status NOT LIKE 'LR'
                  AND user_id IN (select user_id from count_2)
)
SELECT
  CAST( (SELECT count(*) FROM users_1) AS FLOAT) / 
    (SELECT count(*) FROM users_2) AS ratio

注意1:查询没有任何意义,所以我猜有一些拼写错误,或者某些列搞砸了。 count_1将选择状态=' Over'的用户,users_1将选择状态=' LR' (结果已经是ZERO)。

注意2:您不会以这种方式进行查询...以下查询意味着完全相同,并且更简单(更快):

WITH 
count_1 AS 
( 
  SELECT count(user_id) AS c
  FROM   users u
  WHERE      u.description = 'Over'
         AND u.status = 'LR' 
),
count_2 AS 
(   
  SELECT count(user_id) AS c
  FROM   users u
  WHERE      u.description = 'Track'
         AND u.status <> 'LR'
)
SELECT
    (count_1.c + 0.0) / count_2.c AS ratio
FROM
    count_1, count_2 ;

答案 2 :(得分:0)

又一个版本:

SELECT count(*) FILTER (WHERE description = 'Over' AND status LIKE 'LR')
       /
       count(*) FILTER (WHERE description = 'Track' AND status NOT LIKE 'LR')    
       As Ratio
FROM users