我使用红移方法,并需要相关子查询的替代方案。我得到相关的子查询不支持错误。但是,对于尝试确定同一客户在发起交易给定小时内完成的所有销售交易的特定练习,我不确定传统的左连接是否可行。即,查询取决于来自父级选择的上下文或当前值。我也尝试过使用row_number()窗口函数类似的东西,但同样需要在日期范围上窗口/分区的方式 - 而不仅仅是customer_id。相关子查询的红移替代方案
总体目标是找到给定客户id的第一个销售交易,然后查找在第一个交易60分钟内完成的所有后续交易。对于同一客户(最终是数据库中的所有客户)的其余交易,此逻辑将继续。也就是说,一旦从第一笔交易开始建立了最初的60分钟的窗口,第二个60分钟的窗口将在第一个60分钟的窗口结束时开始,并且第二窗口内的所有交易也将被识别并合并然后重复其余的交易。
输出将列出启动60分钟窗口的第一个事务ID,然后列出在60分钟窗口内创建的其他后续事务ID。第二行将显示同一客户在下一个60分钟窗口中创建的第一个交易ID(同样,第一个60分钟窗口的第一个交易过帐将是第二个60分钟窗口的开始),然后后续交易也进行在第二个60分钟窗口内。
在其最基本的形式查询例子看起来像下面的查询:
select
s1.customer_id,
s1.transaction_id,
s1.order_time,
(
select
s2.transaction_id
from
sales s2
where
s2.order_time > s1.order_time and
s2.order_time <= dateadd(m,60,s1.order_time) and
s2.customer_id = s1.customer_id
order by
s2.order_time asc
limit 1
) as sales_transaction_id_1,
(
select
s3.transaction_id
from
sales s3
where
s3.order_time > s1.order_time and
s3.order_time <= dateadd(m,60,s1.order_time) and
s3.customer_id = s1.customer_id
order by
s3.order_time asc
limit 1 offset 1
) as sales_transaction_id_2,
(
select
s3.transaction_id
from
sales s4
where
s4.order_time > s1.order_time and
s4.order_time <= dateadd(m,60,s1.order_time) and
s4.customer_id = s1.customer_id
order by
s4.order_time asc
limit 1 offset 1
) as sales_transaction_id_3
from
(
select
sales.customer_id,
sales.transaction_id,
sales.order_time
from
sales
order by
sales.order_time desc
) s1;
例如,如果客户提出了以下交易:
customer_id transaction_id order_time
1234 33453 2017-06-05 13:30
1234 88472 2017-06-05 13:45
1234 88477 2017-06-05 14:10
1234 99321 2017-06-07 8:30
1234 99345 2017-06-07 8:45
预期结果将是如下:
customer_id transaction_id sales_transaction_id_1 sales_transaction_id_2 sales_transaction_id_3
1234 33453 88472 88477 NULL
1234 99321 99345 NULL NULL
而且,它出现红移不支持横向联接这似乎以进一步限制我选择的方案。任何帮助将不胜感激。
编辑你的问题,并提供样本数据和预期的结果。 。 。以及逻辑应该做什么的解释。 –
他们是否支持窗口函数? CTE的?顺便说一句:你只是从's1'中选择,所以查询的另外两条腿可以用'EXISTS(...)'代替(摆脱丑陋的LIMIT 1) – wildplasser
combined_transaction_id_1同时用作别名和列这是令人困惑的,因为@GordonLinoff说请提供样本数据以及你想要做什么。 – sia