我有5个表的连接,以获得每个成员发布的约有15列的任务。但是对于示例代码,我只使用了两个表。
SELECT TOP 5
dbo.MemberMst.MemberID, dbo.MemberMst.fname,
dbo.TaskMst.TaskMstID, dbo.TaskMst.OnDate, dbo.TaskMst.Description
FROM
dbo.MemberMst
LEFT JOIN
dbo.TaskMst ON dbo.MemberMst.MemberID = dbo.TaskMst.MemberID
输出是:
MemberID fname TaskMstID OnDate Description
3 Ursula NULL NULL NULL
84 Opeyemi 30 2012-09-18 00:00:00.000 asd
85 test 21 2012-09-18 10:30:46.900 aaa
85 test 22 2012-09-18 10:31:04.967 eeee
85 test 23 2012-09-18 10:31:26.640 vvvv
在上面的查询中,我为MemberID=85
获得了3行,他们发布了3个任务,但我只需要来自该成员的一个最新任务。如何获取成员发布的最新任务,结果如下: -
MemberID fname TaskMstID OnDate Description
3 Ursula NULL NULL NULL
84 Opeyemi 30 2012-09-18 00:00:00.000 asd
85 test 23 2012-09-18 10:31:26.640 vvvv
我的意思是说每个memberID
任务只有一条记录吗?
帮助赞赏..!
提前致谢...!
答案 0 :(得分:4)
由于您使用的是SQL Server 2008,因此可以利用Window Functions
。
尝试这样的事情:
SELECT c.MemberID, c.fname, c.TaskMstID, c.OnDate, c.Description
FROM
(
SELECT a.MemberID, a.fname,
b.TaskMstID, b.OnDate, b.Description,
ROW_NUMBER() OVER (Partition BY a.MemberID ORDER BY b.OnDate DESC) RN
FROM MemberMst a
LEFT JOIN TaskMst b
ON a.MemberID = b.MemberID
) c
WHERE c.RN = 1
答案 1 :(得分:3)
;With Cte1 AS
(
SELECT top 5 dbo.MemberMst.MemberID, dbo.MemberMst.fname, dbo.TaskMst.TaskMstID, dbo.TaskMst.OnDate, dbo.TaskMst.Description
FROM dbo.MemberMst left JOIN
dbo.TaskMst ON dbo.MemberMst.MemberID = dbo.TaskMst.MemberID
),
Cte2 As
( SELECT Rn = Row_Number() Over(Partition by MemberId Order By OnDate Desc), *
From Cte1
)
Select *
From Cte2
Where Rn = 1
应该为你完成任务。尝试一下。
答案 2 :(得分:1)
你必须使用MAX {)函数{/ 3}使用Group BY()条款
with CTE as(
SELECT TOP 5
dbo.MemberMst.MemberID,
dbo.MemberMst.fname,
dbo.TaskMst.TaskMstID,
dbo.TaskMst.OnDate,
dbo.TaskMst.Description
FROM
dbo.MemberMst left
JOIN dbo.TaskMst
ON dbo.MemberMst.MemberID = dbo.TaskMst.MemberID)
select dbo.MemberMst.MemberID,
dbo.MemberMst.fname,
dbo.TaskMst.TaskMstID,
max(dbo.TaskMst.OnDate) as OnDate,
dbo.TaskMst.Description
from CTE
group by MemberID
答案 3 :(得分:1)
您可以按MemberID进行分区,然后对其进行排名,只选择排名靠前的项目。
有关MSDN
的更多信息尝试这样的事情
WITH MyCte AS
(SELECT top 5 dbo.MemberMst.MemberID, dbo.MemberMst.fname, dbo.TaskMst.TaskMstID, dbo.TaskMst.OnDate, dbo.TaskMst.Description,
ROW_NUMBER() OVER (PARTITION BY dbo.MemberMst.MemberID ORDER BY dbo.TaskMst.OnDate DESC) AS RowNum
FROM dbo.MemberMst
left JOIN dbo.TaskMst ON dbo.MemberMst.MemberID = dbo.TaskMst.MemberID)
SELECT *
FROM MyCte
WHERE RowNum > 0
更新: 更改为ROW_NUMBER()而不是RANK()以避免具有相同排名的多行问题。