Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何高效地连接这些列(多行)MS SQL_Sql_Sql Server_Tsql - Fatal编程技术网

如何高效地连接这些列(多行)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;