在提出问题之前,我想告诉大家我一直试图在Google和这里找到解决方案。 不幸的是,我仍然非常认真地坚持这个。我是SQL Server的新手(通常使用MySQL& MongoDB)。我必须将数据库从MySQL迁移到SQL Server。
我想使用 GROUP BY item_id 。我可以在MySQL中做得很好,但它不适用于SQL Server。这是我的示例数据
╔════╦═══════╦════════════╦════════════╦═══════════════════════╗
║ id ║item_id║ lat ║ lng ║ timestamp ║
╠════╬═══════╬════════════╬════════════╬═══════════════════════╣
║ 1 ║ a1 ║51.42743450 ║-0.72776696 ║2017-07-05 09:54:49.000║
║ 2 ║ a1 ║51.59665507 ║-0.72777098 ║2017-07-05 11:54:49.000║
║ 3 ║ b2 ║51.59664690 ║-0.67272032 ║2016-08-10 10:11:49.000║
║ 4 ║ b2 ║51.59664874 ║-0.67270288 ║2016-08-10 11:05:49.000║
║ 5 ║ b2 ║51.59665167 ║-0.67271587 ║2016-08-10 10:08:49.000║
╚════╩═══════╩════════════╩════════════╩═══════════════════════╝
这是我的 MySQL 代码,
SELECT item_id, lat, lng, MAX(timestamp) AS latest FROM record GROUP BY item_id;
它会正确地给我,
╔═══════╦════════════╦════════════╦═══════════════════════╗
║item_id║ lat ║ lng ║ latest ║
╠═══════╬════════════╬════════════╬═══════════════════════╣
║ a1 ║51.59665507 ║-0.72777098 ║2017-07-05 11:54:49.000║
║ b2 ║51.59664874 ║-0.67270288 ║2016-08-10 11:05:49.000║
╚═══════╩════════════╩════════════╩═══════════════════════╝
但是当我在SQL Server中尝试时它无法正常工作。它在表格中给了我每一行。他是SQL Server代码,
SELECT asset_id, lat, lng, MAX(timestamp) AS latest FROM
mydb.record
GROUP BY asset_id, lat, lng
我也试过这个,我在Stackoverflow上找到了(我真的很困惑),
SELECT a.asset_id, a.lat, a.lng FROM mydb.record a
INNER JOIN (
SELECT asset_id, MAX(timestamp) latest FROM mydb.record
GROUP BY asset_id
) b
ON a.asset_id = b.asset_id
它还没有用。我真的坚持使用SQL Server世界。请有人帮助我。感谢。
答案 0 :(得分:1)
您可以使用如下的row_number:
Select item_id, lat, lng, latest from (
Select *, RowN = Row_Number() over(partition by item_id order by latest desc) from mydb.record --yourtable
) a where a.RowN = 1
其他方式
id car_id create_time remark
6c3befd0201a4691 4539196f55b54523986535539ed7beef 2017-07-1 16:42:49 firstcar
769d85b323bb4a1c 4539196f55b54523986535539ed7beef 2017-07-18 16:42:49 secondcar
984660c4189e499 575d90e340d14cf1bef4349b7bb5de9a 2017-07-3 16:42:49 firstjeep
答案 1 :(得分:0)
在sql server中,mydb.record
将被解释为
架构名称:Mydb
表名:记录
如果没有错误Mydb
是数据库名称,那么它应该Mydb.schemaname.record
SELECT a.asset_id, a.lat, a.lng FROM mydb.record a
INNER JOIN (
SELECT asset_id, MAX(timestamp) latest FROM Mydb.dbo.record --here
GROUP BY asset_id
) b
ON a.asset_id = b.asset_id
默认情况下,sql server使用dbo
架构,如果您的表存在于任何其他架构中,请使用它代替dbo
我会用Row_Number
select * from
(
SELECT item_id, lat, lng, timestamp,
Row_Number()Over(item_id order by timestamp desc) as Rn
FROM record
) a
Where Rn = 1