Присоединиться к подзапросу и получить самую последнюю дату - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть две таблицы:

КЛИЕНТЫ

ID   NAME
001  John
002  Sara

CLIENT_STATUS

CLIENT_ID   STATUS   DATE
001         3        2018-01-02
001         2        2018-01-04
002         2        2018-01-02
002         1        2018-01-03

Я хочу отфильтровать по status = 1, и я просто хочу самую последнюю датув течение указанного периода времени.

Пока у меня есть:

DECLARE 
    @StartDate  DATE,
    @EndDate    DATE
SET @StartDate  = '2016-07-01'    
SET @EndDate    = '2018-06-30'    

SELECT 
   c.NAME
 , c.ID
 , cs.STATUS
FROM CLIENT c
LEFT JOIN (
    SELECT cs.CLIENT_ID, cs.DATE 
    FROM CLIENT_STATUS 
    WHERE STATUS = 1 AND h.DATE BETWEEN @StartDate AND @EndDate
) AS hst ON hst.CLIENT_ID = c.ID

Только это не Порядок по самой последней дате.

Обратите внимание, что это часть более крупного запроса.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Вы можете использовать row_number() функцию:

SELECT TOP (1) WITH TIES c.ID, c.NAME, cs.DATE
FROM CLIENT c INNER JOIN
     CLIENT_STATUS cs
     ON cs.CLIENT_ID = c.ID 
WHERE cs.STATUS = 1 AND cs.DATE >= @StartDate AND cs.DATE <= @EndDate
ORDER BY ROW_NUMBER() OVER (PARTITION BY c.ID ORDER BY cs.DATE DESC);
0 голосов
/ 20 сентября 2018

Соединение влево (или INNER) с подзапросом с номерами строк:

SELECT *
FROM CLIENTS
LEFT JOIN (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY CLIENT_ID ORDER BY DATE DESC) AS rn
    FROM CLIENT_STATUS
    WHERE STATUS = 1
) RECENT_STATUS ON CLIENTS.ID = RECENT_STATUS.CLIENT_ID AND RECENT_STATUS.rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...