gpt4 book ai didi

sql - 选择新客户的订单

转载 作者:行者123 更新时间:2023-12-01 07:10:31 25 4
gpt4 key购买 nike

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

表格及相关字段如下:

Order        Customer       
------- -----------
orderId customerId
orderDate
customerId
etc.

我正在寻找订单记录的结果集,其中客户 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

我希望结果是
[orderId]    [orderDate]    [etc.]
--------- ----------- ------
o1 1/1/14 foo
o3 1/3/14 bar

订单 o2 和 o4 被忽略,因为 c2 已经订购了两次。

任何帮助将不胜感激。

对不起,没有把我失败的尝试。这是我试过的...
SELECT customerId,
orderId,
orderDate,
Count(*)
FROM Orders
GROUP BY orderId,
orderDate,
customerID
HAVING Count(*) = 1
ORDER BY orderId

它似乎返回了所有订单。

最佳答案

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

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

由于有时行人方法比复杂的 CTE 更受欢迎,如果需要,您可以使用派生表(但由于它使用 OVER 子句,您仍然需要 SQL Server 2005+):
SELECT *
FROM ( SELECT *,
N = COUNT(*) OVER(PARTITION BY customerId)
FROM Orders) T
WHERE N = 1

或者(例如,如果您使用的是早于 2005 版本的 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 ;

或使用 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
) ;

关于sql - 选择新客户的订单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21559620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com