2012-10-26 54 views
0

得到历史数据我有一个存储的状态变化的历史一个人这样的表:SQL查询从表

id | username | date | status 

日期字段时,状态更新和状态字段包含该人自该日起的新状态。

所以在我的表中的日期可能是这样的:

 
1 | serafeim | 2012-03-03 | "NEW" 
2 | john | 2012-03-05 | "NEW" 
3 | serafeim | 2012-03-13 | "PENDING" 
4 | serafeim | 2012-03-15 | "OLD" 
5 | john | 2012-03-05 | "PENDING" 

等等等等

现在,我想有一个查询,在过去的某个特定日期将检索每个用户当时的状态。例如,对于2012-04-14我想得到下面的结果

 
serafeim | "PENDING" 
john | "NEW" 

为2012-03-04我应该得到

 
serafeim | "NEW" 

有人能想出一个SQL查询即会去做 ?我不想以编程方式做这个!我使用MySQL,但我不认为这是相对于我的问题......

在此先感谢

回答

3

下面的查询标识的最新记录为给定的用户名,指定的日期之前,并加入带有最新记录ID的历史记录表以获取其余细节。

SELECT a.* 
FROM 
    history a 
    JOIN (SELECT username, MAX(id) 'id' FROM history 
     WHERE date < @inputDate 
     GROUP BY username 
     ) as b 
    ON a.id = b.id 
1

获取用户的第一条记录具有日期小于或等于输入日期:

declare @userid nvarchar(128) 
declare @date datetime 

SELECT userid, status 
FROM 
(
    SELECT limit 1 * FROM mytable 
    WHERE date <= @date 
    AND userid = @userid 
    ORDER by date desc 
) 

未测试!对不起,如果有任何语法错误。

1

我现在无法在MySql数据库上测试,但这个查询应该可以完成这项工作。

表2查询检索在所需日期之前为每个用户名注册事件的最大日期:这应该是该人的最后状态事件。

连接获取状态。

select username, status from table 
join 
(
select username, max(date) as maxdate from table 
where date <= '2012-04-14' 
group by username) table2 
on table.username = table2.username and table.date = table.2maxdate 

另一种方式,可以不参加

select username, status from table 
where date = (select max(date) as maxdate from table 
where date <= '2012-04-14' 
group by username)