如何高效地连接这些列(多行)MS SQL
我有以下数据库架构:如何高效地连接这些列(多行)MS SQL,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下数据库架构: Purchases [PurchaseID, CustomerID, Date...] PurchasesReturns [PurchaseReturnID, PurchaseID, ...] 采购包含大量的行,而采购返回的行则少得多 我想计算一下,对于每一个曾经进行过退货的客户(并且仅针对他们!),从他们第一次购买到每次退货的天数。输出示例: PurchaseID | CustomerID | DaysFromCustomersFirstPurch
Purchases [PurchaseID, CustomerID, Date...]
PurchasesReturns [PurchaseReturnID, PurchaseID, ...]
采购包含大量的行,而采购返回的行则少得多
我想计算一下,对于每一个曾经进行过退货的客户(并且仅针对他们!),从他们第一次购买到每次退货的天数。输出示例:
PurchaseID | CustomerID | DaysFromCustomersFirstPurchase
--------------------------------------------------------
1001| 1| 215
1002| 1| 216
1003| 1| 218
1004| 2| 184
1005| 2| 188
1007| 4| 24
1008| 5| 102
注-以上所有采购均已退回(其ID位于PurchasesReturns表中)
注意-购买100110021003是在不同的日期进行的,因此从客户1第一次购买之日算起的天数是不同的
注意-ID为3的客户从未进行过购买退货,因此他的购买不在那里
我做了类似的事情,但我不确定这是否正确,也不确定它是否有效——它永远不会结束(几个小时的测试)
另外,我只想得到第一次购买的日期,我必须加上天数
感谢您的建议。您可以汇总
购买
表以获得第一个日期,然后加入
:
select pr.*,
datediff(day, p.first_date, pr.date) as days_to_return
from purchasereturns pr join
(select customerid, min(date) as first_date
from purchases p
group by customerid
) p
on p.customerid = pr.customerid;
编辑:
您希望差异发生在购买日期,而不是退货日期。为此:
select pr.*,
datediff(day, p.first_date, p.date) as days_to_return
from purchasereturns pr join
(select p.*,
min(date) over (partition by customerid) as first_date
from purchases p
) p
on p.purchaseid = pr.purchaseid;
非常感谢你!但为了让一切都清楚-我想计算的日期差异是客户第一次购买和每一次退货(而不是退货本身)之间的差异-我们感兴趣的两个日期都来自采购表。第二件事-PurchaseReturn中没有CustomerID,我们必须从购买中获取它。但是,你的帮助很大:)@pablo11pablo11。谢谢你的澄清。在这种情况下,窗口函数比聚合更合适。你在退货单上有购买id真是太好了。并不是所有的数据库都有这样的信息。两个注意事项——我想从客户第一次购买到退货之间的天数仍然是多少?我想在每次购买(在PurchaseReturn表中有退货)和客户第一次购买之间进行计数。第二件事-我们希望为每一次购买(有回报)都这样做,而不是为每一次购买回报。难道我们不需要从购买表中选择它(并过滤它)?@pablo11pablo11。我不明白第二个条件。如果一次购买可以有多个退货,那么聚合或
select distinct
可能会满足您的需求。我很难解释。不过——非常感谢,你帮了我很多忙!:)
select pr.*,
datediff(day, p.first_date, p.date) as days_to_return
from purchasereturns pr join
(select p.*,
min(date) over (partition by customerid) as first_date
from purchases p
) p
on p.purchaseid = pr.purchaseid;