SQL-如何根据列从不同行中选择值
Posted
技术标签:
【中文标题】SQL-如何根据列从不同行中选择值【英文标题】:SQL- How to select value from different rows based upon a column 【发布时间】:2020-03-20 13:29:57 【问题描述】:尝试在互动后发现客户订单中的变化。 订单:
Customer_ID Start_dt End_dt Order_item
1 01/01/2020 14/01/2020 Apples
1 15/01/2020 01/02/2020 Bananas
1 02/02/2020 07/02/2020 Oranges
1 08/02/2020 Null Grapes
互动:
Customer_ID Interaction_Dt
1 02/02/2020
想要的输出:
Customer_id Interaction_Dt Order_Pre Order_Post
1 02/02/2020 Bananas Oranges
我曾尝试使用 CASE 函数,但它只获取 Order_Post 并为 Order_Pre 提供 null
select interactions.customer_id, interactions.interaction_dt,
case when interactions.interaction_dt - orders.end_dt = 1 then orders.Order_item else 0 end as Order_pre,
case when orders.start_dt - interactions.interaction_dt = 1 then orders.order_item else 0 end as order_post
from interactions
left join orders
on interactions.customer_id = orders.customer_id
对 SQL 很陌生,因此我们将不胜感激。 这样做的目的是在客户与我们的业务互动后查看他们将订单更改为什么。实际的表格有更多的客户和交互,所以我试图创建一个关于客户进行交互的所有日期的摘要,他们将订单从什么更改为。 编辑:更新表名以使其更清晰,如有任何混淆,请见谅
【问题讨论】:
什么是数据库? Sybase、PostgreSQL、H2 等 为此使用 teradata 您将 Interaction_Dt 与 2 个不同的列进行比较。为什么\如何的逻辑对我来说不是很明显。您能解释一下互动前\互动后是什么意思吗? 不能给你确切的答案,因为我不明白日期比较逻辑,但我认为解决方案的关键在于你需要将订单表(table1)加入交互表 (table2) 两次(其中连接条件是日期比较) 只是一个关于提问的小技巧——如果你能给你的表提供具体的名称(交互、订单),那么你会更容易思考你的问题并为你提供帮助 【参考方案1】:我想你只想要一个join
和lag()
:
select t2.*, t1.order_pre, t1.order as order_post
from table2 t2 join
(select t1.*,
lag(order) over (partition by customer_id order by start_dt) as order_pre
from table1 t1
) t1
on t2.custoemr_id = t1.customer_id and
t2.Interaction_Dt >= t1.start_dt and
t2.Interaction_Dt <= t1.end_dt;
【讨论】:
感谢戈登的回复。我会试试看,让你知道它是怎么回事:)以上是关于SQL-如何根据列从不同行中选择值的主要内容,如果未能解决你的问题,请参考以下文章