[英]How to find whether the same customers who ordered this month also ordered the next month?
[英]How to write query to find commalities such as customers who ordered in same dates?
在一个名为orders的表中,带有列
OrderID CustomerID .. OrderDate ..
我正在寻找在相同日期订购并希望生成结果集的成对客户,例如
CustomerID1 CustomerID2 NumberOfCommonDates
到目前为止,我最好的猜测是:
SELECT * FROM [Orders] AS a, [Orders] AS b
WHERE a.OrderDate = b.OrderDate AND a.CustomerID <> b.CustomerID
任何提示将不胜感激
您可以自加入表并使用聚合:
select
o1.CustomerID CustomerID1,
o2.CustomerID CustomerID2,
count(*) NumberOfCommonDates
from
orders o1
inner join orders o2
on o1.CustomerID < o2.CustomerID
and o1.OrderDate = o2.OrderDate
group by
o1.CustomerID,
o2.CustomerID
加入条件o1.CustomerID < o2.CustomerID
确保您我们不会将记录与自身加入,并且还避免了结果集中的重复,例如('customerA', 'customerB')
vs ('customerB', 'customerA')
。
注意:这假定列OrderDate
是DATE
数据类型。 如果它是DATETIME
,那么您需要在比较之前提取日期部分,例如:
date(o1.OrderDate) = date(o2.OrderDate)
我正在寻找在相同日期订购并希望生成结果集的成对客户,例如
CustomerID1 CustomerID2 NumberOfCommonDates
基于此,您需要与其他答案类似的自联接和聚合。 但是,您需要小心可能在同一日期下多个订单的客户。
这个问题的正确答案是:
SELECT o1.CustomerID as CustomerID1,
o2.CustomerID as CustomerID2,
COUNT(DISTINCT o1.OrderDate) as NumberOfCommonDates
FROM Orders o1 JOIN
Orders o2
ON o1.OrderDate = o2.OrderDate AND
o1.CustomerID < o2.CustomerID
GROUP BY o1.CustomerID, o2.CustomerID
ORDER BY NumberOfCommonDates DESC;
o1.CustomerID < o2.CustomerID
因此同一对客户不会出现两次。
根据对其他问题的评论,我不确定这是您真正想要的。 但是,我认为您实际提出的问题至少应该有一个正确的答案。
如果这不是您想要的,我建议您提出一个新问题并提供示例数据、所需结果以及对您想要的内容的清晰解释。
这是你想要的吗?
SELECT t.customerid, t1.customerid,
Count(distinct *) as numberofdates
FROM [Orders] t join Orders t1
on t.date=t1.date and t.customerid<>
t1.customerid group by customerid
@Arzev Mansuri 走在正确的轨道上。 稍微修改一下就可以得到你的三列了。 甚至还有两个有第一个和最后一个共同日期:
SELECT o1.customer, o2.customer, Count(*) cnt, min(o1.pdate) dmin, case when count(*)>1 THEN max(o1.pdate) END dmax
FROM tbl o1
inner join tbl o2 on o1.pdate=o2.pdate and o1.customer<o2.customer
group by o1.customer, o2.customer
样品 output:
customer customer cnt dmin dmax
Ginny Hagrid 1 03.10.2019 00:00:00 NULL
Ginny Harry 1 07.10.2019 00:00:00 NULL
Ginny Hermiony 1 03.10.2019 00:00:00 NULL
Hagrid Hermiony 1 03.10.2019 00:00:00 NULL
Harry Ron 2 01.10.2019 00:00:00 01.10.2019 00:00:00
在此处查看演示: https://rextester.com/DUGF43842
你可以试试这个
SELECT o1.customerid, o2.customerid, Count(*) as commonDates FROM Orders o1 join Orders o2 on o1.orderdate=o2.orderdate group by o1.customerid, o2.customerid
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.