mysql - 大查询:加入第二个表中的单个最新行
问题描述
我有两张桌子。一个是 的列表Orders
,一个是 的列表Events
。
对于每个,Order
我想加入在.Event
clicked_at
created_at
Order
我已经尝试了多种方法来使其正常工作,并在 Stack Overflow 上尝试了其他几个答案,但我正在努力返回正确的数据。
在我看来,子查询的 sudo 逻辑是这样的:
SELECT campaign, user_id, created_at
FROM `Events`
WHERE order.user_id = user_id AND clicked_at < order.created_at
ORDER created_at DESC
LIMIT 1
请看下面的示例数据:
# Orders
| order_id | user_id | created_at |
-----------------------------------
| 123 | abc | 2020-07-04 |
| 456 | abc | 2020-05-01 |
# Events
| campaign | keyword | user_id | clicked_at |
----------------------------------------------
| facebook | shoes | abc | 2020-07-03 |
| google | hair | abc | 2020-07-01 |
我想要的结果
# Orders with campaign attribution
| order_id | user_id | created_at | campaign | keyword |
---------------------------------------------------------
| 123 | abc | 2020-07-04 | facebook | shoes |
| 456 | abc | 2020-06-04 | null | null |
谢谢!亚历克斯
解决方案
with orders as (
select 123 as order_id, 'abc' as user_id, cast('2020-07-04' as date) as created_at union all
select 456, 'abc', '2020-05-01'
),
events as (
select 'facebook' as campaign, 'shoes' as keyword, 'abc' as user_id, cast('2020-07-03' as date) as clicked_at union all
select 'google', 'hair', 'abc', '2020-07-01'
),
logic as (
select
orders.order_id,
orders.user_id,
orders.created_at,
events.clicked_at,
events.campaign,
events.keyword,
row_number() over (partition by orders.order_id order by events.clicked_at desc) as rn
from orders
left join events
on orders.user_id = events.user_id and events.clicked_at < orders.created_at
)
select * except(rn)
from logic
where rn = 1
推荐阅读
- javascript - 如何使用 addeventlistner 在 javascript 中绑定事件?
- go - 如何使用自定义验证器验证结构数据类型?
- java - 如何使用 Bouncy Castle 创建与 OpenSSH 兼容的 ED25519 密钥?
- c# - 玩家在被传送/传送 Unity3d 后无法移动
- c# - 如何将匿名对象传递给具有多种泛型类型的泛型方法?
- r - 找出 R 中数据中的前 10 个 corr 特征
- xcode - RN ios 使用 Xcode 构建:为什么我收到这么多警告(构建时间)?
- reactjs - 我如何在反应原生输入中进行计算?
- abstract-syntax-tree - 如何表示抽象树中替换的 kleisli 组合
- javascript - 为什么要对 Symbol.iterator 使用方括号?