数据如下:
拒绝:
代理名称 | 拒绝_时间 |
---|---|
约翰 | 1/10/2024 12:48:47 下午 |
莎莉 | 2024 年 1 月 26 日 11:03:34 上午 |
约翰 | 1/18/2024 01:31:24 下午 |
约翰 | 2/2/2024 09:14:09 上午 |
点击日志:
c日期 | 代理名称 | 行动 |
---|---|---|
2024-01-10 12:48:37 下午 | 约翰 | 用户对窗口 2 执行了某些操作 |
2024-04-24 12:48:57 下午 | 莎莉 | 用户对窗口 1 执行了某些操作 |
2024 年 1 月 26 日 11:03:44 上午 | 莎莉 | 用户对窗口 2 执行了某些操作 |
我意识到日期全都搞乱了并且格式不同。我已经将其转换为时间戳。现在假设我已经弄清楚了日期转换。
我希望能够知道代理是否在 refusal_time 的 -30 秒内点击了“窗口 2”,并简单地返回 true/false。查询的返回结果应该是 Refusals 中的所有字段以及一个新列,如果上述条件为 TRUE,则显示 TRUE/FALSE。
对于上述数据,我期望得到以下输出:
代理名称 | 拒绝_时间 | 代理_点击 |
---|---|---|
约翰 | 1/10/2024 12:48:47 下午 | 正确 |
莎莉 | 2024 年 1 月 26 日 11:03:34 上午 | 错误 |
约翰 | 1/18/2024 01:31:24 下午 | 错误 |
约翰 | 2/2/2024 09:14:09 上午 | 错误 |
请注意,Sally 返回了 FALSE,因为她的点击发生在 refusal_time 之后 10 秒(只关心之前 30 秒内)。
谢谢!
这是一个有效的 SQL 查询和测试数据,说明了一种解决方案:
CREATE OR REPLACE TABLE `test.refusals` (
agent_name STRING,
refuse_time TIMESTAMP
) AS
SELECT "John", TIMESTAMP("2024-01-10T12:48:47") UNION ALL
SELECT "Sally", TIMESTAMP("2024-01-26T11:03:34") UNION ALL
SELECT "John", TIMESTAMP("2024-01-18T13:31:24") UNION ALL
SELECT "John", TIMESTAMP("2024-02-02T09:14:09");
CREATE OR REPLACE TABLE `test.clicklog` (
cdate TIMESTAMP,
agent_name STRING,
action STRING
) AS
SELECT TIMESTAMP("2024-01-10T12:48:37"), "John", "XXX" UNION ALL
SELECT TIMESTAMP("2024-04-24T12:48:57"), "Sally", "XXX" UNION ALL
SELECT TIMESTAMP("2024-01-26T11:03:44"), "Sally", "XXX";
SELECT *, EXISTS(
SELECT agent_name FROM `test.clicklog` as C
WHERE C.agent_name = R.agent_name AND C.cdate BETWEEN TIMESTAMP_SUB(R.refuse_time, INTERVAL 30 SECOND) AND R.refuse_time
) AS agent_clicked
FROM `test.refusals` as R