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
似乎很久以前我就需要创建自己的 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