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】:

我想你只想要一个joinlag()

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-如何根据列从不同行中选择值的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询以选择具有最小值的不同行

在Oracle SQL中从同一列的不同行中选择多个变量的值

在一个表中的不同行和不同列中查找相同的值SQL

在 Oracle PL/SQL 中,当列的其余值相等时,我可以交换表中两个不同行的同一列的值吗?

如何将 BigQuery 上的记录从不同行更改为一行?

如何从一列的不同行中获取值以分隔列