Запрос SQL для получения 1 последней записи для каждого члена на основе последней даты

У меня есть база данных, как это:

---------------------------------------------------
| MemberID | IntrCode | InstruReply | CreatedDate |  ...other 2 more columns
---------------------------------------------------
| 6        | 1        | Activated   | 26 FEB 2014 |
| 7        | 2        | Cancelled   | 25 FEB 2014 |
| 6        | 2        | Cancelled   | 15 FEB 2014 |
| 7        | 1        | Activated   | 03 FEB 2014 |
---------------------------------------------------

Теперь на основе CreatedDate и instCodeМне нужен запрос, который возвращает результаты следующим образом на основе instCode в качестве параметра.

когда @IntrCode = 1Мне нужен только активный MemberID по последней (CreatedDate).

PS: обратите внимание, член 7 отменяется при проверке последней (CreatedDate).

Выход

---------------------------------------------------
| MemberID | IntrCode | InstruReply | CreatedDate |
---------------------------------------------------
| 6        | 1        | Activated   | 26 FEB 2014 |
---------------------------------------------------

Я написал приведенный ниже запрос и не могу показать другие столбцы.(Я ценю вашу помощь)

SELECT MemberID, MAX(CreatedDate) AS LatestDate FROM MyTable GROUP BY MemberID

5 ответов

Решение

Попробуй это

Способ 1:

SELECT * FROM
(
  SELECT *,ROW_NUMBER()OVER(PARTITION BY MemberID Order By CreatedDate DESC) RN
  FROM MyTable WHERE InstruReply = 'Activated' AND IntrCode = @IntrCode
) AS T
WHERE RN = 1

Способ 2:

 SELECT * FROM
 (
   Select MemberID,max(CreatedDate) as LatestDate from MyTable group by MemberID
 ) As s INNER Join MyTable T ON T.MemberID = S.MemberID AND T.CreatedDate = s.LatestDate
 WHere T.InstruReply = 'Activated' T.IntrCode = @IntrCode

Скрипка Демо

Выход

---------------------------------------------------
| MemberID | IntrCode | InstruReply | CreatedDate |
---------------------------------------------------
| 6        | 1        | Activated   | 26 FEB 2014 |
---------------------------------------------------

Вы можете использовать CTE и ROW_NUMBER функция:

With CTE As
(
    SELECT t.*, 
           RN = ROW_NUMBER()OVER(PARTITION BY MemberID Order By CreatedDate DESC)
    FROM MyTable t
    WHERE IntrCode = @IntrCode
)
SELECT MemberID, IntrCode, InstruReply, CreatedDate
FROM CTE
WHERE RN = 1

DEMO

;with TempData as (Select MemberId, IntrCode   ,InstruReply,CreatedDate  , MemberCount =ROW_NUMBER()
                over(PARTITION By MemberId Order By CreatedDate desc)
                From MyTable 
                )

Select *
From TempData
Where MemberCount =1

В написанном вами запросе просто отсутствует WHERE пункт, который поможет вам отфильтровать нужные вам данные:

SELECT MemberID, MAX(CreatedDate) AS LatestDate
FROM MyTable
WHERE IntrCode = @IntrCode
  AND InstruReply = 'Activated'
GROUP BY MemberID

Таким образом, вы можете выбрать целую строку для каждого члена с последней датой.

SELECT * FROM MyTable t1
WHERE NOT EXISTS (SELECT * 
                  FROM MyTable t2 
                  WHERE t2.CreatedDate > t1.CreatedDate
                  AND t1.MemberID = t2.MemberID)
AND IntrCode = @IntrCode
Другие вопросы по тегам