SQL语句中的最后数据

时间:2017-03-18 22:40:31

标签: sql greatest-n-per-group

我对IN声明有疑问。我有两张桌子。

表1

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

TABLE_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 个答案:

答案 0 :(得分:2)

使用IN语句将返回该值匹配的所有记录,这将最终返回Table_2中的所有值,除了id = 5(表1中的device_id为5 isn&t; t)。此外,使用IN语句可以更好地处理使用INNER JOIN语句的方式。

实现目标的更好方法是使用自联接。基本上,我将Table_2重新加入到自身,只返回最高的" id"表中与device_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

答案 1 :(得分:0)

如果您的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的回答,因为我认为它为其他DBMS提供了一个非常重要的 ANSI-SQL 解决方法作为MySql,通常使用变量来实现相同的效果。