从首次购买客户中选择订单

Cla*_*vis 3 sql sql-server select

我需要帮助构建一个SQL查询,该查询返回仅订购一次的客户的订单.

表格和相关字段如下:

Order        Customer       
-------      -----------     
orderId      customerId    
orderDate     
customerId     
etc.            
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个订单记录的结果集,其中只有一个客户ID出现.对于以下数据集......

[orderId]    [customerId]     [orderDate]    [etc.]
----------   ------------   ------------   ------------
o1           c1                 1/1/14        foo
o2           c2                 1/1/14        baz
o3           c3                 1/3/14        bar
o4           c2                 1/3/14        wibble
Run Code Online (Sandbox Code Playgroud)

我希望结果如何

[orderId]    [orderDate]    [etc.]
---------    -----------    ------
o1           1/1/14         foo 
o3           1/3/14         bar 
Run Code Online (Sandbox Code Playgroud)

订单o2和o4被省略,因为c2订购了两次.

任何帮助将不胜感激.

对不起,没有把我失败的尝试.这就是我试过的......

SELECT customerId,
       orderId,
       orderDate,
       Count(*)
FROM   Orders
GROUP  BY orderId,
          orderDate,
          customerID
HAVING Count(*) = 1
ORDER  BY orderId 
Run Code Online (Sandbox Code Playgroud)

它似乎返回所有订单.

Lam*_*mak 14

尝试以下(假设SQL Server 2005+):

;WITH CTE AS
(
    SELECT  *,
            N = COUNT(*) OVER(PARTITION BY customerId)
    FROM Orders
)
SELECT *
FROM CTE
WHERE N = 1
Run Code Online (Sandbox Code Playgroud)

由于有时行人方法比复杂的CTE更受欢迎,因此如果需要,可以使用派生表(但由于它使用了该OVER子句,您仍然需要SQL Server 2005+):

SELECT *
FROM (  SELECT  *,
                N = COUNT(*) OVER(PARTITION BY customerId)
        FROM Orders) T
WHERE N = 1
Run Code Online (Sandbox Code Playgroud)

或者(例如,如果您使用的是旧版本的SQL-Server),您可以使用该GROUP BY / HAVING COUNT(*)=1方法查找只有1个订单的客户,然后再加入Orders表中(不需要在所有列中使用聚合函数):

SELECT o.*
FROM Orders o
  JOIN
    ( SELECT customerId
      FROM Orders
      GROUP BY customerId
      HAVING COUNT(*) = 1
    ) c
    ON c.customerId = o.customerId ;
Run Code Online (Sandbox Code Playgroud)

或使用NOT EXISTS(COUNT()不需要,甚至在MySQL中也可以):

SELECT o.*
FROM Orders o
WHERE NOT EXISTS
    ( SELECT 1
      FROM Orders c
      WHERE c.customerId = o.customerId 
        AND c.orderId <> o.orderId
    ) ;
Run Code Online (Sandbox Code Playgroud)

  • 最后两个示例对我的情况最好,因为聚合函数阻止我在另一个表上执行Stuff函数. (2认同)