sql - 如何选择最近的值?

标签 sql sql-server

我有一个记录表,从许多探测器中收集值:

CREATE TABLE [Log]
(
  [LogID] int  IDENTITY (1, 1)   NOT NULL,
  [Minute] datetime  NOT NULL,
  [ProbeID] int   NOT NULL DEFAULT 0,
  [Value] FLOAT(24)  NOT NULL DEFAULT 0.0,

  CONSTRAINT Log_PK PRIMARY KEY([LogID])
)
GO

CREATE INDEX [Minute_ProbeID_Value] ON [Log]([Minute], [ProbeID], [Value])
GO

通常,每个探测器大约每分钟生成一个值。一些示例输出:

LogID   Minute            ProbeID Value
======  ================  ======= =====
873875  2014-07-27 09:36  1972    24.4
873876  2014-07-27 09:36  2001    29.7
873877  2014-07-27 09:36  3781    19.8
873878  2014-07-27 09:36  1963    25.6
873879  2014-07-27 09:36  2002    22.9
873880  2014-07-27 09:36  1959    -30.1
873881  2014-07-27 09:36  2005    20.7
873882  2014-07-27 09:36  1234    23.8
873883  2014-07-27 09:36  1970    19.9
873884  2014-07-27 09:36  1991    22.4
873885  2014-07-27 09:37  1958    1.7
873886  2014-07-27 09:37  1962    21.3
873887  2014-07-27 09:37  1020    23.1
873888  2014-07-27 09:38  1972    24.1
873889  2014-07-27 09:38  3781    20.1
873890  2014-07-27 09:38  2001    30
873891  2014-07-27 09:38  2002    23.4
873892  2014-07-27 09:38  1963    26
873893  2014-07-27 09:38  2005    20.8
873894  2014-07-27 09:38  1234    23.7
873895  2014-07-27 09:38  1970    19.8
873896  2014-07-27 09:38  1991    22.7
873897  2014-07-27 09:39  1958    1.4
873898  2014-07-27 09:39  1962    22.1
873899  2014-07-27 09:39  1020    23.1

获取每个探测器最新读数的最有效方法是什么?

例如所需的输出(注意:“值”不是例如 Max() 或 Avg()):

LogID   Minute             ProbeID  Value
======  =================  =======  =====
873899  27-Jul-2014 09:39  1020     3.1
873894  27-Jul-2014 09:38  1234     23.7
873897  27-Jul-2014 09:39  1958     1.4
873880  27-Jul-2014 09:36  1959     -30.1
873898  27-Jul-2014 09:39  1962     22.1
873892  27-Jul-2014 09:38  1963     26
873895  27-Jul-2014 09:38  1970     19.8
873888  27-Jul-2014 09:38  1972     24.1
873896  27-Jul-2014 09:38  1991     22.7
873890  27-Jul-2014 09:38  2001     30
873891  27-Jul-2014 09:38  2002     23.4
873893  27-Jul-2014 09:38  2005     20.8
873889  27-Jul-2014 09:38  3781     20.1

最佳答案

这是另一种方法

select *
  from log l
 where minute =
       (select max(x.minute) from log x where x.probeid = l.probeid)

您可以使用 fiddle 比较执行计划 - http://sqlfiddle.com/#!3/1d3ff/3/0

关于sql - 如何选择最近的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24979628/

相关文章:

sql 查询将单元格值设置为另一列中的另一个单元格减去先前结果的差值

sql - 选择 'EXIST' 或 'NotExist' 作为列

sql - 无法回滚子事务。未找到该名称的事务或保存点

mysql - 规范化 - 将数据迁移到另一个表

mysql - 如何通过连接从表中检索数据

sql - Oracle:索引表的行的子集

sql - 在 SQL 中将行转换为列

SQL 分组依据和交叉应用

sql-server - 简单的 CHECK 约束没那么简单

sql - 在 SQL 中安全地更新计数(字段)