有条件地确定某个值是否在另一个表中的范围内并返回 true/false

问题描述 投票:0回答:1

数据如下:

拒绝:

代理名称 拒绝_时间
约翰 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 google-bigquery
1个回答
0
投票

这是一个有效的 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
© www.soinside.com 2019 - 2024. All rights reserved.