2017-07-18 84 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