2017-07-18 55 views
1

在提出问题之前,我想告诉大家,我一直在尝试在Google和这里找到解决方案。 不幸的是,我仍然认真地坚持这个。我是SQL Server的新手(通常使用MySQL & MongoDB)。我必须将数据库从MySQL迁移到SQL Server。SQL Server Group By基于一列

我想使用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 

我也曾经尝试这样做,我已经#2发现(这我真搞不清楚),

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世界困住了。请有人帮助我。谢谢。

回答

1

写这篇文章,您可以如下使用ROW_NUMBER:

Select top (1) with ties item_id, lat, lng, latest 
    from yourtable 
Order by Row_Number() over(partition by item_id order by latest desc) 

其他方式

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 
+0

这些工作完美。你节省了我的时间。非常感谢 ! –

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