我遇到了这个问题,我现在已经挣扎了一段时间,阅读了很多帖子,但却无法通过自己解决这个问题。
我有一张表,记录了俱乐部成员身份变化的记录。 “Status_Members”
MemberID Date StatusID
23 2011-04-01 1
46 2011-05-01 2
23 2011-10-01 2
46 2011-06-01 1
它连接到一个表“Status_Type”,其中包含StatusID的值。
StatusID StatusName
1 Active
2 Passive
将2加在一起得到:
MemberID Date StatusName
23 2011-04-01 Active
46 2011-05-01 Passive
23 2011-10-01 Passive
46 2011-06-01 Active
现在我希望能够在特定日期找到成员的状态。
让我们说2011-07-01。
所以我尝试了这段代码:
SELECT S.MemberID, MAX(Date), ST.StatusName FROM Status_Members S, Status_Type ST
WHERE ST.StatusId=S.StatusID
AND
Date <= '2011-07-01'
Group By MemberID
Order by Date DESC
所以我希望结果是:
MemberID, MAX(Date), StatusName
46 2011-06-01 Active
23 2011-04-01 Active
但我得到了这个“错误”的结果
MemberID, MAX(Date), StatusName
46 2011-06-01 Passive
23 2011-04-01 Active
为什么我在MemberID 46上获得结果Passive而不是Active???
任何人都可以帮我吗???
最好的关注一个新手
答案 0 :(得分:2)
当您与MAX
进行汇总时,您无法控制未获得聚合或收集的代表行,即您的状态ID。所以做两个查询并加入它们:
SELECT sm.MemberID AS MemberId, MaxDate, StatusName
FROM Status_Type AS st
JOIN Status_Members AS sm ON (st.StatusId = sm.StatusId)
JOIN (SELECT MemberID, MAX(Date) AS MaxDate FROM Status_Members WHERE Date <= xxx GROUP BY MemberID) AS sq
ON (sm.MemberId = sq.MemberId AND sm.Date = sq.MaxDate);
子查询生成一个中间表MemberId, MaxDate
,我们再次将Member_Status
表再次加入,以检索该日期的状态。
答案 1 :(得分:0)
在您的查询中,您GROUP BY
member.id。因此,您的MAX()函数返回给定成员的MAX日期,46
为2011-06-01
。它不应该返回ST.StatusName
,因为它不是聚合函数或GROUP BY
的一部分,所以我猜它只是第一次出现。
答案 2 :(得分:0)
您是否尝试过GROUP
BY
statusName?
SELECT S.MemberID, MAX(Date) as maxDate, ST.StatusName FROM Status_Members S, Status_Type ST
WHERE ST.StatusId=S.StatusID
GROUP BY MemberID, StatusName
HAVING maxDate <= '2011-07-01'
ORDER By Date DESC