2017-10-20 8 views
1

이들은결과 표시 특정 날짜의 SQL 서버 후 고객 첫번째 순서에 따라

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년 1월 9일을 '후 첫 주문을 한 고객을 반환하려면 현재의 내 결과입니다 '

내가 내가 분명히

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 
012을 얻을

WHERE Orders.Date > '2017-01-09' 

를 사용하는 경우 3,516,

하지만 내가 찾고 있어요 출력이

입니다
CustomerID  OrderID Date TableFK 
    2    4  2017-01-10 2 
    2    5  2017-01-09 2 
    2    6  2017-01-16 2 

내가 어떻게 이것을 달성 할 수 있습니까? 내가 http://sqlfiddle.com/#!9/3d55d/2

답변

3

having 절을 사용하여 SQL 바이올린을 가지고 : (.은 SQL 바이올린은 here입니다)

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

당신이 Customersjoin 필요하지 않습니다

주 당신이 필요로 원하는 고객 때문에 명령을 내린다.

네이밍에 대한 의견. TableFK이라는 이름은 실제로 의미가 없습니다. 그것은 열을 전혀 설명하지 않습니다. 외부 키가 참조하는 기본 키와 동일한 이름을 갖는 팬이므로 TableFK 대신 CustomerId이 표시됩니다.

+0

그래, 나는 명명 규칙을 알고있다. 그것은 단지 간단한 예였습니다. 이 코드는 작동하지만 정확한 출력을 제공하지 않습니다. 다른 주문을 표시하고 그룹화하지 않으려면 어떻게해야합니까? 어떻게하면 같은 결과를 얻을 수 있습니까? –

+0

@ RyanGadsdon. . . 나는 당신의 코멘트에있는 질문을 이해하지 못합니다. 새로운 질문은 일반적으로 의견보다는 질문으로 질문해야합니다. –

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

작성한 바이올린을 사용해야합니다.