用于返回每个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:我什么时候应该投反对票?每当你遇到一篇极其草率、不费力气的帖子,或者一个答案明显地、甚至可能是危险地不正确时,请使用你的反对票。在极端情况下,应保留否决权。它并不是用来代替交流和编辑的。不要投反对票:如果这篇文章是垃圾邮件或攻击性的,就把它标记出来。如果问题重复或离题,请标记以引起主持人注意。如果有问题,请留下评论或编辑帖子以更正。