场景:找出每个工厂中的任何客户,这些客户有三个或更多订单,其中包含他们以前从未购买过的新商品。例如,约翰有:
Order A: Item 1, Item 2
Order B: Item 2, Item 3, Item 4
Order C: Item 3
订单 B 包含约翰以前从未购买过的商品,而订单 C 则没有。
换句话说:从每个客户的第二个订单开始,我们想知道他们有多少订单,其中至少有一件商品以前从未出现在他们的订单中。
表架构:请参阅SQL Fiddle。RelatedRecordID 将多个记录绑定到一个订单中。
我的方法:另请参阅上面的 SQL Fiddle。这种方法有缺陷且不稳健。在前面John的例子中,这个方法会给出2个增量,但是因为订单C放在B之后,所以实际上只有一个增量。如果订单 B 不包含项目 3,则其优先级不会影响结果。
有人能想出解决办法或新方法吗?
CTE 首先找到第一个订单,而不是每件商品都被购买(每个客户和工厂),然后我们简单地计算不同的订单 ID(并减去 1,因为第一个订单不计算在内):
在SQLfiddle.com中测试
我不确定性能,恕我直言,它至少需要一个索引
([FactoryID], [CustomerID], [RelatedRecordID])
首先,我筛选了那些拥有 3 个或更多订单的客户,然后我对每个订单的不同行进行了编号,
([RelatedRecordID])
以避免最终结果出现第一个项目,并且我计算了该项目被购买了多少次。最后它返回那些已经购买过一次的物品。
dbfiddle在这里
就像一个想法:
所有标有 -1 的订单都包含新项目。
此查询基于您的示例数据。假设 RelatedRecordID 是购买的顺序。