我怎么做这个说我有一堆寄存器,他们有一个终端id = 4741,我只想要那天的最后一条记录。我正在使用SQL Server 2008 R2。
home.html
但是说上面的查询返回以下内容我只想要最后一次19:57:58一个我认为顺序就足够但它只是按升序给我带来。
SELECT TOP 1000
[id]
,[data_atualizacao]
,[direcao]
,[velocidade]
,[latitude]
,[longitude]
,[nivel_bateria]
,[enum_status_gps]
,[id_terminal]
FROM
[TecnologiaGPS_V2].[dbo].[posicao_historico_terminal_82015]
WHERE
id_terminal = 4741
ORDER BY
data_atualizacao ASC
这就是我在c#
中获取数据的方式 id_terminal 19:57:05
id_terminal 19:57:15
id_temminal 19:57:58
所以我的问题是如何获取最新的时间戳,并且当我将分页600万条记录时,我的代码也足够了。即使我总是将终端ID传递给查询。
答案 0 :(得分:0)
select
[id], [data_atualizacao], [direcao], [velocidade],
[latitude], [longitude], [nivel_bateria],
[enum_status_gps],[id_terminal]
from
(select
[id],
row_number() over(partition by id order by data_atualizacao desc) rn,
[data_atualizacao], [direcao], [velocidade],
[latitude], [longitude], [nivel_bateria],
[enum_status_gps], [id_terminal]
from
[TecnologiaGPS_V2].[dbo].[posicao_historico_terminal_82015]
where
id_terminal = 4741) t
where
t.rn = 1
您可以使用row_number
窗口函数获取每个ID的最新记录。
答案 1 :(得分:0)
Select top 1 *
from TecnologiaGPS_V2
where id_terminal = 4741
order by data_atualizacao desc
答案 2 :(得分:0)
您也可以使用和汇总数据,而不是对数据进行排序。
SELECT *
FROM
[TecnologiaGPS_V2].[dbo].[posicao_historico_terminal_82015]
WHERE
id_terminal = 4741
AND data_atualizacao = (SELECT MAX (data_atualizacao) FROM [TecnologiaGPS_V2].[dbo].[posicao_historico_terminal_82015] as subquery
WHERE id_terminal = subquery.id_terminal)
执行订单可能会导致数据库服务器的额外工作。根据数据集大小,排序可能非常昂贵。虽然您也可以依赖索引来保持为您排序,但您将支付索引维护费用。 Sql server擅长聚合,这可能总体上表现更好。此外,根据您的表定义,您可以保证1行。
答案 3 :(得分:0)
从tablename中选择top 1 *,其中[condition] order by [column] desc;
检查逐个运行每个查询。
SELECT * FROM订单,其中EmployeeID = 4;
SELECT前1 * FROM订单,其中EmployeeID = 4 order by OrderDate desc;
in
http://www.w3schools.com/sql/trysql.asp?filename=trysql_func_first&ss=-1