根据特定日期 SQL 服务器后客户的第一个订单显示结果
Displaying results based on customer first order after specific date SQL Server
这些是我目前的结果
CustomerID OrderID Date TableFK
1 1 2017-01-05 1
1 2 2017-01-06 1
1 3 2017-01-10 1
2 4 2017-01-10 2
2 5 2017-01-09 2
2 6 2017-01-16 2
现在基本上我想要 return 在 '2017-01-09' 或之后下第一笔订单的客户
如果我使用
WHERE Orders.Date > '2017-01-09'
我显然明白了
CustomerID OrderID Date TableFK
1 3 2017-01-10 1
2 4 2017-01-10 2
2 5 2017-01-09 2
2 6 2017-01-16 2
但我正在寻找的输出是
CustomerID OrderID Date TableFK
2 4 2017-01-10 2
2 5 2017-01-09 2
2 6 2017-01-16 2
我怎样才能做到这一点?我有一个 SQL fiddle http://sqlfiddle.com/#!9/3d55d/2
使用 having
子句:
select o.TableFK as CustomerId
from Orders o
group by o.TableFK
having min(o.Date) >= '2017-01-09';
(SQL Fiddle 是 here。)
请注意,您不需要 join
到 Customers
,因为您想要的客户需要有订单。
关于命名的评论。 TableFK
这个名字真的没什么意义。它根本没有描述该列。我喜欢让外键与它们所指的主键同名,所以 CustomerId
而不是 TableFK
.
您可以使用内部联接和 where 子句来执行此操作。
在问题中使用你的 fiddle 的内容:
select o.* from orders o
inner join (
select tableFK, min(date) as firstOrder
from orders
group by tableFK ) f
on f.tableFK = o.tableFK
where f.firstOrder >= '17-01-09'
我只是 运行 检查客户是否在您日期之前的订单 table 中有记录,如下所示:
SELECT *
FROM Customer c
INNER JOIN Orders o
ON c.CustomerID = o.TableFK
WHERE NOT EXISTS
(SELECT 1
FROM Orders
WHERE Orders.TableFK = o.TableFK
AND Date < '2017-01-09')
这应该适用于您创建的 fiddle。
这些是我目前的结果
CustomerID OrderID Date TableFK
1 1 2017-01-05 1
1 2 2017-01-06 1
1 3 2017-01-10 1
2 4 2017-01-10 2
2 5 2017-01-09 2
2 6 2017-01-16 2
现在基本上我想要 return 在 '2017-01-09' 或之后下第一笔订单的客户
如果我使用
WHERE Orders.Date > '2017-01-09'
我显然明白了
CustomerID OrderID Date TableFK
1 3 2017-01-10 1
2 4 2017-01-10 2
2 5 2017-01-09 2
2 6 2017-01-16 2
但我正在寻找的输出是
CustomerID OrderID Date TableFK
2 4 2017-01-10 2
2 5 2017-01-09 2
2 6 2017-01-16 2
我怎样才能做到这一点?我有一个 SQL fiddle http://sqlfiddle.com/#!9/3d55d/2
使用 having
子句:
select o.TableFK as CustomerId
from Orders o
group by o.TableFK
having min(o.Date) >= '2017-01-09';
(SQL Fiddle 是 here。)
请注意,您不需要 join
到 Customers
,因为您想要的客户需要有订单。
关于命名的评论。 TableFK
这个名字真的没什么意义。它根本没有描述该列。我喜欢让外键与它们所指的主键同名,所以 CustomerId
而不是 TableFK
.
您可以使用内部联接和 where 子句来执行此操作。
在问题中使用你的 fiddle 的内容:
select o.* from orders o
inner join (
select tableFK, min(date) as firstOrder
from orders
group by tableFK ) f
on f.tableFK = o.tableFK
where f.firstOrder >= '17-01-09'
我只是 运行 检查客户是否在您日期之前的订单 table 中有记录,如下所示:
SELECT *
FROM Customer c
INNER JOIN Orders o
ON c.CustomerID = o.TableFK
WHERE NOT EXISTS
(SELECT 1
FROM Orders
WHERE Orders.TableFK = o.TableFK
AND Date < '2017-01-09')
这应该适用于您创建的 fiddle。