我有一个表格,可以将状态更改的历史记录存储到这样的人:
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,但我认为这与我的问题无关......
提前致谢
答案 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 )