SQL查找满足特定条件的最新记录

时间:2017-02-06 05:37:39

标签: sql sql-server-2008 greatest-n-per-group

我觉得这应该很容易,但我很难得到它。我们有一个包含UnitID,DateTimeStamp和UnitStatus的表。像这样:

enter image description here

如果他们的最后一个UnitStatus是LO,我试图找到每个单元的最新记录(基于DateTimeStamp)。所以在屏幕截图中,我采用了一个示例数据库,我希望它能够返回:

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

(它不会返回E03,因为E03在其LO的UnitStatus之后有一个AV的UnitStatus)

我尝试使用不同的where语句执行max(cdts)。将查询连接到使用max(cdts)的另一个查询。但无论我尝试什么,我都无法得到我正在寻找的结果。

6 个答案:

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

答案 1 :(得分:0)

尝试使用desc关键字

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

答案 2 :(得分:0)

尝试使用window function row_number获取每个UnitID的最新记录

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

答案 3 :(得分: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'

答案 4 :(得分:0)

SELECT DISTINCT检索UnitID,OUTER APPLY ed subselect检索具有最新状态的单位ID' LO':

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'

答案 5 :(得分:0)

使用ROW_NUMBER()函数获取上面指定的每个UnitId的最新记录。作为第二步根据他们的rowindex和Status过滤记录,那么我认为你应该能够实现你想要的东西

第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