SQL Server Group By基于一列

时间:2017-07-18 09:56:50

标签: sql-server

在提出问题之前,我想告诉大家我一直试图在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世界。请有人帮助我。感谢。

2 个答案:

答案 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