0

我有一个表,其中存储了这样一个人的状态更改历史记录:

id | username | date | status

日期字段是状态更新的时间,状态字段包含此人自该日期以来的新状态。

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

1 | 塞拉芬| 2012-03-03 | “新的”
2 | 约翰 | 2012-03-05 | “新的”
3 | 塞拉芬| 2012-03-13 | “待办的”
4 | 塞拉芬| 2012-03-15 | “老的”
5 | 约翰 | 2012-03-05 | “待办的”

等等等等

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

塞拉芬| “待办的”
约翰 | “新的”

对于 2012-03-04 我应该得到

塞拉芬| “新的”

任何人都可以想到一个可以做到这一点的 SQL 查询吗?我不想以编程方式执行此操作!我正在使用mysql,但我认为这与我的问题无关......

提前致谢

4

3 回答 3

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
于 2012-10-26T09:16:57.880 回答
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
)

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

于 2012-10-26T09:22:28.627 回答
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 )
于 2012-10-26T09:23:03.213 回答