Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于返回每个ID的最新记录的SQL查询_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

用于返回每个ID的最新记录的SQL查询

用于返回每个ID的最新记录的SQL查询,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有一张结构如下的桌子 LocId Value1 Value1Date ............................................. 1 50 2012-10-20 14:21:00.000 1 70 2012-10-21 14:21:00.000 1 90 2012-10-22 14:21:00.000

我有一张结构如下的桌子

LocId    Value1    Value1Date                
.............................................
1        50        2012-10-20 14:21:00.000      
1        70        2012-10-21 14:21:00.000      
1        90        2012-10-22 14:21:00.000      
1        100       2012-10-23 14:21:00.000    
2        20        2012-10-20 14:21:00.000       
2        40        2012-10-21 11:21:00.000      
2        70        2012-10-22 14:21:00.000     
2        80        2012-10-23 14:21:00.000 
3        50        2012-10-20 14:21:00.000       
3        70        2012-10-21 11:21:00.000      
3        80        2012-10-22 14:21:00.000      
3        90        2012-10-23 14:21:00.000
我想要实现的是,对于每个[LocId],我需要最新日期时间(即2012-10-23)的[Value1]。返回的表应该如下所示:

LocId    Value1    Value1Date                
.............................................
1        100       2012-10-23 14:21:00.000
2        80        2012-10-23 14:21:00.000
3        90        2012-10-23 14:21:00.000

有人能帮忙吗?谢谢

这可以通过使用
通用表表达式
窗口函数

WITH records
AS
(
    SELECT  LocID, VAlue1, Value1Date,
            ROW_NUMBER() OVER (PARTITION BY LocID ORDER BY Value1Date DESC) rn
    FROM    TableName
)
SELECT  LocID, VAlue1, Value1Date
FROM    records
WHERE   rn = 1

这可以通过使用
公共表表达式和
窗口函数来实现

WITH records
AS
(
    SELECT  LocID, VAlue1, Value1Date,
            ROW_NUMBER() OVER (PARTITION BY LocID ORDER BY Value1Date DESC) rn
    FROM    TableName
)
SELECT  LocID, VAlue1, Value1Date
FROM    records
WHERE   rn = 1

这种方法会奏效

select locid, value1, value1date
from yourtable join
(select locid id, max(value1date) maxdate
from yourtable
group by locid) temp on id = locid 
and value1date = maxdate

这种方法会奏效

select locid, value1, value1date
from yourtable join
(select locid id, max(value1date) maxdate
from yourtable
group by locid) temp on id = locid 
and value1date = maxdate

这是一个mysql查询,它完成了您要查找的内容。我真的不知道其他SQL

SELECT * FROM table WHERE LocID = n ORDER BY Value1Date DESC LIMIT 1;
如果从程序中查询,可以使用:

SELECT LocID FROM table ORDER BY LocID DESC LIMIT 1;
获取ID的总数(假设它们是连续的),然后将其放入循环中以获取所有最近的日期


希望这会有所帮助。

这是一个mysql查询,可以满足您的需要。我真的不知道其他SQL

SELECT * FROM table WHERE LocID = n ORDER BY Value1Date DESC LIMIT 1;
如果从程序中查询,可以使用:

SELECT LocID FROM table ORDER BY LocID DESC LIMIT 1;
获取ID的总数(假设它们是连续的),然后将其放入循环中以获取所有最近的日期


希望对您有所帮助。

您可以像这样使用rank over partition:

select * from
(select locid, value1, value1date, 
  rank() over (partition by locid order by value1date desc) as rank
  from table1) t
where t.rank=1

请参见

您可以在分区上使用秩,如下所示:

select * from
(select locid, value1, value1date, 
  rank() over (partition by locid order by value1date desc) as rank
  from table1) t
where t.rank=1

请参见

您关于获取所有id并循环使用它们的建议,这是非常低效的。我不经常投反对票,但我就是不喜欢这个答案。引自stackoverflow.com/privileges/vote-down:我什么时候应该投反对票?每当你遇到一篇极其草率、不费力气的帖子,或者一个答案明显地、甚至可能是危险地不正确时,请使用你的反对票。在极端情况下,应保留否决权。它并不是用来代替交流和编辑的。不要投反对票:如果这篇文章是垃圾邮件或攻击性的,就把它标记出来。如果问题重复或离题,请标记以引起主持人注意。如果有问题,请留下评论或编辑帖子来更正。你关于获取所有id并循环使用它们的建议是非常低效的。我不经常投反对票,但我就是不喜欢这个答案。引自stackoverflow.com/privileges/vote-down:我什么时候应该投反对票?每当你遇到一篇极其草率、不费力气的帖子,或者一个答案明显地、甚至可能是危险地不正确时,请使用你的反对票。在极端情况下,应保留否决权。它并不是用来代替交流和编辑的。不要投反对票:如果这篇文章是垃圾邮件或攻击性的,就把它标记出来。如果问题重复或离题,请标记以引起主持人注意。如果有问题,请留下评论或编辑帖子以更正。