编写SQL查询,其中一列是另一列的子集?

时间:2019-09-16 23:45:00

标签: sql postgresql postgresql-9.3

我有一张这样的桌子:

Date    | Action | Ad_ID | Device_ID
--------+--------+-------+-----------
5/13/19 | click  |  342  | 22289
5/14/19 | view   |  342  | 22289

我需要编写一个查询,以获取在一天中至少点击了一个广告的用户数量,以及第二天第二次查看广告的第一组用户的数量。

我将如何处理?我对SQL还是很陌生,并试图在工作中使用它:)

2 个答案:

答案 0 :(得分:0)

我建议使用CTE和自我LEFT JOIN,并进行汇总:

WITH cte AS (SELECT DISTINCT date, device_id, action FROM mytable t)
SELECT 
    c.date,
    COUNT(c.device_id) clicked,
    COUNT(v.device_id) viewed_the_next_day
FROM cte c
LEFT JOIN cte v 
    ON  v.date = c.date + INTERVAL '1 day'
    AND v.device_id = c.device_id 
    AND v.action = 'view'
WHERE x.action = 'click'
GROUP BY c.date

CTE生成唯一的date/device_id/action元组的列表(根据您的实际数据结构,此步骤可能不是必需的)。然后,LEFT JOIN会将在一天中单击的关系用户与在第二天中查看的那些用户联系起来。

答案 1 :(得分:0)

我认为您正在尝试实现这样的目标?

select t1.*, t2.date, t2.action 
from tableA t1
left join tableA t2 
     on t1.date + INTERVAL '1 day' = t2.date 
     and t2.action = 'view'
     and t2.Device_ID= t1.Device_ID
     and t2.Ad_ID= t1.Ad_ID