MATCH 数据与日志事件
MATCH data with log events
我有一个 table events
看起来像这样:
- check_date, 身份证
我有一个 table contracts
看起来像这样:
- sign_date, 编号
我想通过查询向 contracts
table 添加一列(布尔值)。新列 (evaluated
) 即:
True
如果在 events
中至少存在一行合同 Id
匹配并且 (sign_date
- check_date
) 在 0 之间和 3. 当一个合约被检查登录 events
时,我们可以有多个事件。我需要看看是否至少有一个是在合同签署的同一天或最多 3 天前发生的。
执行此操作的最巧妙方法是什么?一个左连接然后再 SELECT distinct
我们匹配的地方似乎是一种奇怪的方式。
所以,像这样:
SELECT t.sign_date,t.id,
max(CASE WHEN s.id is null then 'false' else 'true' end) as boolCol
FROM contracts t
LEFT OUTER JOIN events s
ON(t.id = s.id and sign_date - check_date between 0 and 3)
GROUP BY t.sign_date,t.id
您应该比较两个版本的解释(和资源使用情况),MAX
与 DISTINCT
:
SELECT DISTINCT c.*,
(CASE WHEN e.id IS NULL THEN 'N' else 'Y' end) AS boolCol
FROM contracts AS c
LEFT OUTER JOIN events AS e
ON c.id = e.id
-- I simplified your date logic
AND c.sign_date BETWEEN e.check_date - 3 AND e.check_date)
DISTINCT
更容易编写,优化器可能会自动将其替换为 GROUP BY
处理。
我有一个 table events
看起来像这样:
- check_date, 身份证
我有一个 table contracts
看起来像这样:
- sign_date, 编号
我想通过查询向 contracts
table 添加一列(布尔值)。新列 (evaluated
) 即:
True
如果在events
中至少存在一行合同Id
匹配并且 (sign_date
-check_date
) 在 0 之间和 3. 当一个合约被检查登录events
时,我们可以有多个事件。我需要看看是否至少有一个是在合同签署的同一天或最多 3 天前发生的。
执行此操作的最巧妙方法是什么?一个左连接然后再 SELECT distinct
我们匹配的地方似乎是一种奇怪的方式。
所以,像这样:
SELECT t.sign_date,t.id,
max(CASE WHEN s.id is null then 'false' else 'true' end) as boolCol
FROM contracts t
LEFT OUTER JOIN events s
ON(t.id = s.id and sign_date - check_date between 0 and 3)
GROUP BY t.sign_date,t.id
您应该比较两个版本的解释(和资源使用情况),MAX
与 DISTINCT
:
SELECT DISTINCT c.*,
(CASE WHEN e.id IS NULL THEN 'N' else 'Y' end) AS boolCol
FROM contracts AS c
LEFT OUTER JOIN events AS e
ON c.id = e.id
-- I simplified your date logic
AND c.sign_date BETWEEN e.check_date - 3 AND e.check_date)
DISTINCT
更容易编写,优化器可能会自动将其替换为 GROUP BY
处理。