【问题标题】:How to retrieve the earliest date from columns that have different dimensions?如何从具有不同维度的列中检索最早日期?
【发布时间】:2021-12-20 12:31:38
【问题描述】:

数据说明

我有两个数据表,一个(PAGE VIEWS)代表用户事件(CV 1、2、3 等)以及与成员 ID 相关联的时间戳。第二个表 (ORDERS) 表示已下订单 - 事件时间和订单价值。每张桌子上都有会员 ID。

表 1 - 页面浏览量(总共 1,000 行)

Event_Day Member ID CV1 CV2 CV3 CV4
11/5/2021 115126 APP camp1 Trigger APP-camp1-Trigger
11/14/2021 189192 SEARCH camp4 Search SEARCH-camp4-Search
11/5/2021 193320 SEARCH camp5 Search SEARCH-camp5-Search

表 2 - ORDERS(共 249 行)

Date Purchase Order ID Membership Number Order Value
7/12/2021 0088 183300 29.34
18/12/2021 0180 132159 132.51
4/12/2021 0050 141542 24.35

我要回答的问题

我想在 (PAGE VIEWS) 中的最早事件日期之前将 (ORDERS) 订单值归因于 CV 列 (PAGE VIEWS)。这将是一个简单的归因用例。

Visual explanation of the two data tables

问题

我已经度过了周末的结果并滚动浏览了各种在线文章,但最接近的是使用以下查询

Select min (event_day) As "first date",member_id,cv2,order_value,purchase_order_id
from mta_app_allpages,mta_app_orders
where member_id = membership_number
group by member_id,cv2,order_value,purchase_order_id;

使用 DISTINCT 函数生成的数据是正确的,因为第 2 行与第 1 行不同,但我想将结果关联到第 1 行的 member_id 113290 和第 3 行的 member_id 170897 等。

Date member_id cv2 Order Value
2021-11-01 113290 camp5 58.81
2021-11-05 113290 camp4 58.51
2021-11-03 170897 camp3 36.26
2021-11-09 170897 camp5 36.26
2021-11-24 170897 camp1 36.26

Image showing the results table

我尝试过使用分区和子查询功能,但收效甚微。正确的调用最多应返回 249 行,因为这与我在 ORDERS 表中的行数一样多。

第一次发布海报,希望我的格式正确。非常感谢。

【问题讨论】:

  • 这是个好信息!您使用的是什么数据库(和版本)?还要添加 DB 标记,正如 sql 标记信息所说的那样。
  • 今日提示:切换到现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),如果需要更容易转换为外连接

标签: sql


【解决方案1】:

使用RANK() 是最好的方法:

select * from
     (
       select *, RANK()OVER(partition by membership_number order by Event_Day) as rnk
       from page_views as pv
       INNER JOIN orders as o
       ON pv.Member_ID=o.Membership_Number
     ) as q
where rnk=1

这只会获取最小的event_day

但是,您可以使用MIN() 来实现相同的效果(但使用复杂的sub-query):

select *
from 
(select pv.* 
from page_views as pv
inner join
       (
       select Member_ID, min(event_day) as mn_dt
       from page_views
       group by member_id
       ) as mn
   ON mn.Member_ID=pv.Member_ID and mn.mn_dt=pv.event_day
)as sq
INNER JOIN orders as o
ON sq.Member_ID=o.Membership_Number

这两个查询都会得到相同的答案。

查看 db<>fiddle

中的演示

【讨论】:

  • 非常感谢。昨晚我熬夜到午夜,试图弄清楚如何解决这个问题。如果数据位于同一个表中,我设法使这项工作正常进行,但在大多数情况下,数据位于多个表中,并且作为同一查询的一部分的连接逻辑让我感到困惑。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2020-11-09
  • 2016-12-30
  • 2015-07-11
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多