Запрос 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
;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