在特定日期SQL Server之后根据客户第一个订单显示结果

时间:2017-10-20 11:37:36

标签: sql sql-server where

这些是我目前的结果

 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

现在基本上我想要退回已经在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小提琴http://sqlfiddle.com/#!9/3d55d/2

3 个答案:

答案 0 :(得分:3)

使用having子句:

select o.TableFK as CustomerId
from Orders o
group by o.TableFK
having min(o.Date) >= '2017-01-09';

(SQL小提琴是here。)

请注意,您不需要joinCustomers,因为您想要的客户需要订购。

关于命名的评论。名称TableFK实际上毫无意义。它根本没有描述该列。我很擅长外键与他们所指的主键同名,所以CustomerId代替TableFK

答案 1 :(得分:0)

您可以使用内部联接和where子句来执行此操作。

在问题中使用小提琴的内容:

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'

答案 2 :(得分:0)

我会检查客户是否在您的日期之前的订单表中有记录,如下所示:

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')

这应该与您创建的小提琴一起使用。