选择给定两个时间段但返回不同列值的百分比返回值

时间:2014-06-08 17:38:43

标签: mysql

我有一个查询来选择每个月返回的用户百分比,

 SELECT
(
    SELECT COUNT( DISTINCT t1.user )
    FROM mytable t1
    WHERE t1.month = 'November'
    AND EXISTS (
        SELECT *
        FROM mytable t2
        WHERE t2.user = t1.user
        AND t2.month = 'October'
    )
)
/
(
    SELECT COUNT( DISTINCT mytable.user )
    FROM mytable
    WHERE mytable.month = 'October'
) * 100

但是现在我想看看每个月用户返回的内容,而是转到其他活动,所以 一个月参加一个活动的百分比和一个不同月份的不同活动,但不参加原始活动。

伪代码必须是这样的。

SELECT  user IN event1 october AND users IN event2 november and users NOT IN event1 november /users IN colorado event1 * 100







   user month event 
   -----------------    
   jack october event2 
   jack november event3 
   jack november event3 
   jack november event2 
   jack december event3
   sam november event2 
   sam november event1
   sam october event1
   sam october event2   
   john october event1
   john november event2

1 个答案:

答案 0 :(得分:1)

通过执行INNER JOIN来获取用户在第二个月的活动,并在其中一个已加入的列中查找LEFT JOIN,以验证第一个月的活动是否为{n}不存在,您可以将其限制为叛逃者用户:

此查询仅返回NULL

'john'

如果您在子选择中包装此查询以计算百分比,则它看起来像:

  SELECT
    event1.user
  FROM
    mytable event1
    -- Join to get the same users in the second month
    INNER JOIN mytable event2 ON event1.user = event2.user
    -- and a LEFT JOIN to find those who attend the month1 event in month2
    LEFT JOIN mytable event_excl 
       ON event2.user = event_excl.user 
       AND event2.month = event_excl.month
       AND event_excl.event = 'event1'
  WHERE
    event1.month = 'october' AND event1.event = 'event1'
    AND event2.month = 'november' AND event2.event = 'event2'
    -- Then include *only* those who don't match the event from the LEFT JOIN
    AND event_excl.event IS NULL

...而且计算结果为SELECT ( SELECT COUNT(DISTINCT event1.user) FROM mytable event1 INNER JOIN mytable event2 ON event1.user = event2.user LEFT JOIN mytable event_excl ON event2.user = event_excl.user AND event2.month = event_excl.month AND event_excl.event = 'event1' WHERE event1.month = 'october' AND event1.event = 'event1' AND event2.month = 'november' AND event2.event = 'event2' AND event_excl.event IS NULL ) / ( SELECT COUNT(DISTINCT user) FROM mytable WHERE month = 'october' AND event = 'event1' ) * 100.0 AS defector_percent ,因为50%在10月和11月都有,但john, samjohn没有出现时失败。

此处有效: http://sqlfiddle.com/#!2/460ca/11

关于sam 的注意事项:使用EXISTS作为您的首次发布尝试可以实现同样的目标,但我发现联接更容易映射关系从。 It is possibly faster as well.。或者,EXISTS / NOT EXISTS子查询可能与NOT IN(SELECT...)具有相似的性能。

相关问题