繁体   English   中英

如何编写查询以查找相同日期订购的客户等共性?

[英]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')

注意:这假定列OrderDateDATE数据类型。 如果它是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM