Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询以从跟踪表中获取给定时间内的唯一状态_Sql_Sql Server - Fatal编程技术网

Sql 查询以从跟踪表中获取给定时间内的唯一状态

Sql 查询以从跟踪表中获取给定时间内的唯一状态,sql,sql-server,Sql,Sql Server,让场景选择给定时间内跟踪表中存在的唯一值 表中的值如下: 要为用户在给定时间内选择唯一的RoleName值 示例-如果我将时间设置为下午6点,它应该在下午6点选择每个用户的最新状态 我试着选择如下,但它给出了所有的值,因为我只需要为传递的时间值提供最新的值 Select EmpId, RoleName, MAX(TimeStamp) From [dbo].[EmpRoleHistory] Where TimeStamp <= '2020-02-06 18:00:00.000' GROU

让场景选择给定时间内跟踪表中存在的唯一值

表中的值如下:

要为用户在给定时间内选择唯一的RoleName值

示例-如果我将时间设置为下午6点,它应该在下午6点选择每个用户的最新状态

我试着选择如下,但它给出了所有的值,因为我只需要为传递的时间值提供最新的值

Select  EmpId, RoleName, MAX(TimeStamp)
From [dbo].[EmpRoleHistory]
Where TimeStamp <= '2020-02-06 18:00:00.000'
GROUP BY EmpId, RoleName
ORDER BY EmpId
当前结果:

1   Developer   2020-02-06 08:00:00.000
1   Mgr         2020-02-06 17:00:00.000
2   Developer2  2020-02-06 17:00:00.000
2   Lead        2020-02-06 08:00:00.000
3   Lead2       2020-02-06 17:00:00.000
3   Mgr         2020-02-06 08:00:00.000

使用子查询,但不存在

with cte as
(
Select  EmpId, RoleName, TimeStamp
From [dbo].[EmpRoleHistory]
Where TimeStamp <= '2020-02-06 17:00:00.000'
)
select * from cte a
where not exists
(
select 1 from cte b where a.EmpId= b.EmpId and a.TimeStamp < b.TimeStamp
)
使用cte作为
(
选择EmpId、RoleName、TimeStamp
来自[dbo]。[EmpRoleHistory]
其中TimeStamp问题就在这里

GROUP BY EmpId, RoleName
如我所见,相同的
EmpId
RoleName
不同

这就是为什么你会得到不同的价值观

;带有cte\u
(
选择EmpId,MAX(TimeStamp)作为时间戳
来自[dbo]。[EmpRoleHistory]

其中TimeStamp使用子查询或CTE返回每个员工在提供的日期时间之前的最新EmpRoleHistory记录,然后将子查询连接到主表以提取这些记录的RoleName值

Select erh.EmpId, erh.RoleName, erh.TimeStamp
From [dbo].[EmpRoleHistory] as erh
Inner Join (
    Select  EmpId, MAX(TimeStamp) as TimeStamp
    From [dbo].[EmpRoleHistory]
    Where TimeStamp <= '2020-02-06 18:00:00.000'
    GROUP BY EmpId
    ) as filt on erh.EmpId = filt.EmpId and 
erh.TimeStamp = filt.TimeStamp
Order By erh.EmpId
选择erh.EmpId、erh.RoleName、erh.TimeStamp
来自[dbo].[EmpRoleHistory]作为erh
内连接(
选择EmpId,MAX(TimeStamp)作为时间戳
来自[dbo]。[EmpRoleHistory]

如果TimeStamp感谢回复,上面的查询也会选择时间过去之前的所有值。有没有方法不用子查询就可以做到这一点,在实际场景中,我有一个巨大的表,子查询可能会影响生成此报告的性能。请先对其进行测试。CTE的性能非常好。我的答案中的查询只给出一行per empID.My bad,sub query select在where中有RoleName,使用empidy获得正确的结果您应该给我们样本数据,并将相应的结果作为文本而不是图像,因此在下午5点之前或之后选择最近的用户和时间戳?@Phong在中添加了样本数据text@maSTAShuFu任何给定时间的最新状态,如我下午5点通过ar用户一天有多个更新,我想看看他在5PMHow的状态关于当前结果和预期结果?
GROUP BY EmpId, RoleName
 ;with cte_TempTable as
(
Select  EmpId, MAX(TimeStamp) as TimeStamp
From [dbo].[EmpRoleHistory]
Where TimeStamp <= '2020-02-06 17:00:00.000'
GROUP BY EmpId
)
select e.*
from EmpRoleHistory e
inner join cte_TempTable c on e.EmpId = c.EmpId
where e.TimeStamp = c.TimeStamp
ORDER BY e.EmpId
Select erh.EmpId, erh.RoleName, erh.TimeStamp
From [dbo].[EmpRoleHistory] as erh
Inner Join (
    Select  EmpId, MAX(TimeStamp) as TimeStamp
    From [dbo].[EmpRoleHistory]
    Where TimeStamp <= '2020-02-06 18:00:00.000'
    GROUP BY EmpId
    ) as filt on erh.EmpId = filt.EmpId and 
erh.TimeStamp = filt.TimeStamp
Order By erh.EmpId