SQL 声明 仅当天最新条目

SQL Statement Only latest entry of the day

似乎很久以前我就需要创建自己的 SQL 语句。我有一个带有时间戳 (TS) 和值 (VALUE) 的 table (GAS_COUNTER)。 每天有数百个条目,但我只需要当天的最新条目。我尝试了不同的方法,但从未得到我需要的。

编辑

感谢您的快速回复,但有些不符合我的需求(我需要 table 中每天的最新值),有些则不起作用。我最好的陈述是:

select distinct (COUNT),
 from
  (select
   extract (DAY_OF_YEAR from TS) as COUNT,
   extract (YEAR from TS) as YEAR,
   extract (MONTH from TS) as MONTH,
   extract (DAY from TS) as DAY,
   VALUE as VALUE
 from GAS_COUNTER
order by COUNT)

但缺少值。如果我把它放在第一个 select 所有行 return。 (逻辑正确,因为每一行都是不同的) 这里是 Table 内容的示例:

TS                      VALUE  
2015-07-25 08:47:12.663 0.0
2015-07-25 22:50:52.155 2.269999999552965
2015-08-10 11:18:07.667 52.81999999284744
2015-08-10 20:29:20.875 53.27999997138977
2015-08-11 10:27:21.49  54.439999997615814

第二次编辑和解决

select TS, VALUE from GAS_COUNTER  
where TS in (
    select max(TS) from GAS_COUNTER group by extract(DAY_OF_YEAR from TS)
)

这个会给你最后一条记录:

select top 1 * from GAS_COUNTER order by TS desc 

这里有一个可以为您提供每天的最后记录:

select VALUE from GAS_COUNTER 
where TS in (
    select max(TS) from GAS_COUNTER group by to_date(TS,'yyyy-mm-dd')
)

根据您使用的数据库,您可能需要 replace/adjust to_date(TS,'yyyy-mm-dd') 函数。基本上它应该从时间戳中提取仅限日期的部分。

像这样的东西会 window 数据并给你当天的最后一个值 - 但是如果你得到两个相同的 TS 会发生什么?你想要哪一个?

select *
from (  select distinct cast( TS as date ) as dt
        from GAS_COUNTER ) as gc1       --  distinct days
    cross apply (
        select top 1 VALUE      --  last value on the date.
        from GAS_COUNTER as gc2
        where gc2.TS < dateadd( day, 1, gc1.dt )
          and gc2.TS >= gc1.dt
        order by gc2.TS desc
        ) as x

Select 时间戳的最大值。

select MAX(TS), value -- or whatever other columns you want from the record
from GAS_COUNTER
group by value