0

可能重复:
获取列的最大值所在的行

我有两张桌子

1. A table USER with a USER_ID, NAME, ...
2. A table STATUS with a STATUS_ID, PEOPLE_FK (foreign key to USER_ID), LABEL, DATE_START...

一个用户只能有一个活动状态。我使用 DATE_START 字段来保存用户所有状态的历史记录。我从不删除状态。如果我在 USER 和 STATUS 之间创建连接,我可以轻松地获得所有用户的所有状态。但我想创建一个查询来检索我所有的用户,他们只有最后的状态。可能吗 ?我应该用什么?

4

4 回答 4

0

像这样加入:

SELECT *
FROM USER   U
JOIN STATUS S ON U.USER_ID = S.USER_ID
              AND NOT EXISTS (
                SELECT 1 
                FROM   STATUS S2
                WHERE  S2.USER_ID = S.USER_ID 
                AND    S2.START_DATE > S.START_DATE
              )

这只会加入那些不存在同一用户的其他状态且日期较新的状态记录

于 2012-08-21T14:56:54.560 回答
0

尝试

select * from user 
inner join 
(
   select * from status
   inner join 
      (select max(Date_start) as maxdate, status_id as id  
           from status group by Status_id)   d
   on status_id = d.id and Date_start = d.maxdate
)d1 
on userid =d1.People_fK
于 2012-08-21T14:57:40.740 回答
0

我假设您使用的是 SQL-Server :

您可以使用带有ROW_NUMBER功能的 cte:

WITH CTE AS
(
    SELECT U.USER_ID, U.NAME, U.DATE_START, S.STATUS
    ,   RN = ROW_NUMBER()OVER(PARTITION BY S.STATUS_ID ORDER BY U.DATE_START DESC)
    FROM USER U INNER JOIN STATUS S ON U.User_ID=S.PEOPLE_FK
)
SELECT * FROM CTE WHERE RN = 1
于 2012-08-21T14:59:05.263 回答
0
select * from 
    user a, 
    status b 
where 
      a.user_id = b.poeple_id 
  and b.start_date = (select max(start_date) 
                             from status c 
                             where c.people_id=b.people_id)
于 2012-08-21T14:59:24.980 回答