如何获取在2020年1月至少访问过两次但未进行交易(在任何一次1月访问中)的所有访客ID的列表

zbdgwd5y  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(367)

table:
会议
会话\n
访客id
垂直的
会话\u id
交易
会话\n
会话\u id
rev\铲斗
收入
当前有以下查询(使用sqlite):

SELECT
   visitor_id,
   session_id,
   running_total
FROM 
  (
    SELECT
      s.visitor_id,
      s.session_id,
      t.revenue,
      ROW_NUMBER() OVER(PARTITION BY s.visitor_id ORDER BY t.session_ts) as row_num,
      SUM(revenue) OVER(PARTITION BY s.visitor_id) as running_total
    FROM sessions s
    JOIN transactions t
    ON s.session_id = t.session_id
    WHERE s.session_ts >= '2020-01-01' AND s.session_ts < '2020-02-01'
  ) sub
Where running_total = 0
AND row_num >= 2

示例表的结果:

欢迎任何反馈,提前谢谢。不确定上述查询是否正确。还想知道我是否可以为每个访问者显示单独的会话id,如下所示:

jvlzgdj9

jvlzgdj91#

我假设一次会议就是一次访问。那就是:

select s.visitor_id
from sessions s
where s.session_ts >= '2020-01-01' and s.session_ts < '2020-02-01' and
      not exists (select 1
                  from transactions t
                  where t.session_id = s.session_id
                 )
group by s.visitor_id
having count(*) >= 2;
wa7juj8i

wa7juj8i2#

如果没有负面的交易,除了你没有把 order by 所以你需要修正。虽然您在别名中称之为运行总数,但它实际上根本没有运行。不确定这是否是命名或实现的混乱。如果您按美元的相反顺序排序,使非零行显示在第一行,那么当您到达第二行并且运行总数仍然为零时,那么您的访问将处于正确的轨道上,那么这个访问者必须确实符合条件。但这有点迂回。
为了让游客们独处,我觉得用一个简单的 group by 去做这项工作。这是我的建议:

GROUP BY s.visitor_id
HAVING COUNT(*) >= 2 AND SUM(revenue) = 0

但既然您希望保留会话ID,那么您毕竟需要分析函数:

SELECT visitor_id, session_id,
    ROW_NUMBER() OVER (PARTITION BY visitor_id ORDER BY session_ts) as row_num
FROM 
(
    SELECT s.visitor_id, s.session_id, s.sessions_ts, 
        SUM(revenue) OVER (PARTITION BY s.visitor_id) as total,
        COUNT(*) OVER (PARTITION BY s.visitor_id) as num_sessions
    FROM sessions s INNER JOIN transactions t
        ON s.session_id = t.session_id
    WHERE s.session_ts >= '2020-01-01' AND s.session_ts < '2020-02-01'
) sub
WHERE total = 0 AND total_sessions >= 2

把零美元列作为输出没有明确的目的,这就是为什么我把它们漏掉了。您甚至可能不需要该行号列,但请注意它现在位于外部查询中。
如果负收入是可能的,那么一笔款项将不总是工作。请考虑比较这两个值是否相等:

COUNT(*) OVER (PARTITION BY s.visitor_id)

COUNT(CASE WHEN revenue = 0 THEN 1 END) OVER (PARTITION BY s.visitor_id)

相关问题