最后一个数据的SQL in语句

最后一个数据的SQL in语句,sql,greatest-n-per-group,Sql,Greatest N Per Group,我对语句中的有问题。我有两张桌子 表1 id | active_device_id| device_status 0 | 1 | 1 1 | 2 | 1 2 | 3 | 1 表2 id | device_id | value 0 | 1| 10 1 | 2| 20 2 | 3| 30 3 | 1| 40

我对语句中的
有问题。我有两张桌子

表1

id    | active_device_id| device_status
0     |  1              | 1
1     |  2              | 1
2     |  3              | 1
表2

id | device_id | value
0  |          1| 10
1  |          2| 20
2  |          3| 30
3  |          1| 40
4  |          2| 50
5  |          5| 60
我想根据表_1从表_2中获取设备的最后一个值

所以我用这个

select * 
from Table_2
where device_id in (
    select active_device_id
    from Table_1
    where device_status=1
 )
 order by id desc
此查询获取设备的所有记录。但我想得到每台设备的最后一条记录。很快我就想把这个

id | device_id| value
4  |         2| 50
3  |         1| 40
2  |         3| 30

您能帮我解决这个问题吗?

使用
语句中的
将返回该值匹配的所有记录,这将返回表2中除id=5以外的所有值(表1中没有设备id为5)。另外,在
语句中使用
的方式最好使用
内部联接

实现您所追求的目标的更好方法是使用自联接。基本上,我将表2连接回它自己,并且只为与设备id匹配的每一行返回表中最高的“id”值

SELECT t2.*
FROM Table_2 AS t2
INNER JOIN Table_1 AS t1 ON t2.device_id = t1.active_device_id
  AND t1.device_status = 1
LEFT JOIN Table_2 AS t2self ON t2.device_id=t2self.device_id AND t2self.id>t2.id
WHERE t2self.id IS NULL
ORDER BY t2.id DESC

如果您的DBMS支持窗口函数(顺便说一句,它应该支持),那么有一种稍微简单一点的方法:

select id, device_id, value from 
(
select row_number() over (partition by t2.device_id order by t2.id desc) as rownum,
t2.*
from table_2 t2 join table_1 t1 on t2.device_id = t1.active_device_id and t1.device_status = 1
) temp where rownum = 1

然而,我对Ashley Lee的答案投了赞成票,因为我认为它为MySql等其他DBMS提供了一个非常重要的ANSI-SQL解决方案,通常使用变量来实现相同的效果。

您的答案是ANSI SQL。我知道:-),MySql仍然不支持这一点(它应该支持),因此,另一个答案提供了一个ANSI解决方案。您使用的是哪种DBMS?博士后?神谕DB2?火鸟?谢谢你的回答