将多个简单查询转换为一个?

Posted

技术标签:

【中文标题】将多个简单查询转换为一个?【英文标题】:Converting multiple simple queries into a single one? 【发布时间】:2018-09-13 00:25:16 【问题描述】:

我是 SQL 新手,所以必须像我 5 岁一样解释事情。我试图弄清楚 有多少人执行了“点击了解更多”事件,然后继续执行该事件“设置试用状态”。我正在使用 Postgres,因此我省略了一个额外的 AND payload->>'status' = true 以简化它。本质上,我需要将以下伪查询转换为功能单一的查询。

SELECT DISTINCT booking_id
FROM venue_events
WHERE name = 'clicked learn more'`;

SELECT count(*)
FROM venue_events
WHERE booking = booking_id AND name = 'set trial status' AND payload->>'status' = true;

我怎样才能把它变成一个基本上单一的 SQL 查询,第二个使用第一个中的 booking_ids

下面是表格中的数据。

【问题讨论】:

样本数据和期望的结果真的很有帮助。 嗨,戈登,我很抱歉。我目前没有任何样本数据,这是问题的一部分——我正在这样做。我正在编写一个端点来获取当前正在构建的功能的分析。 但是,每个事件都会有name, timestamp, payloadpayload 是 jsonb。这是一个非常简单的表格,字段不多,这就是为什么我认为即使使用我可以手动创建的包含 5 个条目的数据集来测试它也应该可以实现。 @GordonLinoff 我添加了一张图片,显示了这些数据在表格中的样子。另外,我想要实现的是粗体。 【参考方案1】:

如果没有看到表结构和示例数据,很难完全确定,但如果您想获得在评论中提到的所有计数到另一个答案,我认为这个查询就是您所需要的。

SELECT v1.booking_id AS booking_id,
       COUNT(v1.booking_id) AS Clicked_learn_more, 
       COUNT(v2.booking_id) AS Set_trial_status_true,
       COUNT(v3.booking_id) AS Completed_booking
FROM (SELECT DISTINCT booking_id 
      FROM venue_events 
      WHERE name='clicked learn more' AND payload->>'status' = true) v1
LEFT JOIN (SELECT DISTINCT booking_id 
           FROM venue_events 
           WHERE name='set trial status' AND payload->>'status' = true) v2
    ON v2.booking_id = v1.booking_id
LEFT JOIN (SELECT DISTINCT booking_id 
           FROM venue_events 
           WHERE name='completed booking' AND payload->>'status' = true) v3
    ON v3.booking_id = v1.booking_id
GROUP BY v1.booking_id

【讨论】:

非常感谢,这已经回答了我最初的问题并成功地扩展了它。【参考方案2】:
SELECT count(*)
FROM venue_events
WHERE name = 'set trial status' 
AND booking_id IN
(
    SELECT DISTINCT booking_id
    FROM venue_events
    WHERE name = 'clicked learn more'
)
AND payload->>'status' = true;

【讨论】:

目前看起来不错,只是做一些测试以确保一切正常。 嗨@PepperPaige,有什么方法可以在此查询中单独获取每个计数?这样我就可以得到如下结果:单击了解更多 = 10 设置试用状态为真 = 4 已完成预订 = 1 因为我目前必须执行 3 次查询才能获得这些单独的计数,每个查询的大小都会增加。 当然 - 您可能希望将 GROUP BY 与 COUNT 一起使用。我建议检查可能已经很好地涵盖了堆栈溢出的其他问题,或者如果您发现需要更多信息,请提出其他问题。 你需要IN 而不是=,你可以放弃DISTINCT【参考方案3】:

我认为您需要按名称分组

SELECT name ,count(*)
FROM venue_events
WHERE   payload->>'status' = true
group by name 

【讨论】:

以上是关于将多个简单查询转换为一个?的主要内容,如果未能解决你的问题,请参考以下文章

将多个 self JOIN 转换为窗口函数或子查询 (SQL)

PHP/PDO/MySQL:将多个查询转换为单个查询

将简单查询转换为蛋糕查询?

C# + EntityFramework:通过查询将多个组转换为嵌套 JSON

PYSPARK:如何将带有多个 case 语句的 SQL 查询转换为 Pyspark/Pyspark-SQL?

SQL查询将与多个范围匹配的数字列表转换为值列表