我有一个查询来选择每个月返回的用户百分比,
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
答案 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, sam
在john
没有出现时失败。
此处有效: http://sqlfiddle.com/#!2/460ca/11
关于sam
的注意事项:使用EXISTS
作为您的首次发布尝试可以实现同样的目标,但我发现联接更容易映射关系从。 It is possibly faster as well.。或者,EXISTS / NOT EXISTS
子查询可能与NOT IN(SELECT...)
具有相似的性能。