SQL查询从表中获取历史数据

时间:2012-10-26 09:12:52

标签: mysql 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"

for 2012-03-04我应该

serafeim | "NEW"

有人能想到会这样做的SQL查询吗?我不想以编程方式执行此操作!我正在使用mysql,但我认为这与我的问题无关......

提前致谢

3 个答案:

答案 0 :(得分: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 :(得分: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
)

未经测试!如果有任何语法错误,请抱歉。

答案 2 :(得分:1)

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

table2 查询检索您在所需日期之前为每个用户名注册事件的最长日期:这应该是该人员的最后一次状态事件。

加入获得状态。

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 )