2017-02-06 82 views
0

我觉得这应该很容易,但我很难得到它。我们有一个UnitID,DateTimeStamp和UnitStatus表。像这样:SQL查找符合特定条件的最新记录

enter image description here

我试图找到每个单元的最新记录(基于DateTimeStamp),如果他们最后UnitStatus为LO。所以在截图我已经采取了我会希望有一个样本数据库的它返回:

E02 2017-02-06 03:00:00 LO ..... 
E04 2017-02-06 06:00:00 LO 

(它不会自己LO的UnitStatus后返回E03 E03,因为有AV的UnitStatus)

我试着用不同的where语句做max(cdts)。将查询连接到使用max(cdts)的另一个查询。但无论我尝试什么,我都不会得到我期待的结果。

回答

0

试试这个。 更新阅读更新的问题后,我已经更新了我的答案

SELECT tbl1.* 
FROM defaulttable as tbl1 
RIGHT JOIN 
(
    SELECT UnitStatus FROM defaulttable 
    WHERE UnitStatus = 'LO' 
) as tbl2 
ON tbl1.UnitStatus != tbl2.UnitStatus 
WHERE tbl1 != 'LO' 
ORDER BY tbl1.DateTimeStamp 
0

与DESC关键字试试这个

SELECT * from table 
WHERE UnitStatus = 'LO' 
ORDER BY DateTimeStamp desc 
0

尝试使用窗口函数ROW_NUMBER以获得每个单元ID

Select * 
From (
    Select 
    t.*, 
    Row_number() over (partition by UnitID order by datetimestamp desc) rn 
    From your_table t 
    Where UnitStatus = 'LO' 
) t where rn = 1 
的最新记录
0
with cte as (
    select *, 
    Row_number() over (partition by UnitID order by DateTimeStamp desc) as rn 
    from theTable 
) 
select * 
from cte 
where rn = 1 
and UnitStatus = 'LO' 
0

SELECT DISTINCT检索UnitIDs,在OUTER APPLY版子查询检索与最近的状态,“LO”的unitIDs:

with t as (select distinct unitid from SO42060982) 
select t.*, sub.* 
from t 
outer apply 
    (select top 1 * from SO42060982 sub 
    where t.UnitID = sub.UnitID order by DateTimeStamp desc) sub 
where sub.UnitStatus = 'LO' 
0

使用ROW_NUMBER()函数作为上述规定获得的最新记录每个单元ID。作为第二步根据自己的rowIndex和状态筛选记录,那么我认为你应该能够实现你正在寻找

步骤1

SELECT U.*, 
ROW_NUMBER() OVER (PARTITION BY UNITID ORDER BY DATETIMESTAMP DESC) SNO 
INTO #UNITSTEMP 
FROM UNITS U 

步骤2

SELECT DISTINCT * FROM #UNITSTEMP WHERE SNO = 1 AND UNITSTATUS = 'LO' 

运行上述查询后,您的结果将如下面的屏幕截图所示 enter image description here