SQL-从表中查询每个匹配项的最新值

时间:2018-11-08 20:28:07

标签: sql django sqlite

我有2张桌子,类似于此:

.external{
  flex: 1 1 50%;
  height: 20vh;
  background-color:black;
}

可能的值可以是

人-[1,John],[2,Bob],[3,Jeniffer]

HeightStatus-[100,1,5],[150,1,7],[40,2,12],[30,2,9],[400,3,7]

这意味着我有3个人,在时间100,约翰的身高是5,在时间150,他的身高是7,依此类推

查询特定人员的最新身高很容易(例如,对于ID为1的人员):

Person:
    id
    name

HeightStatus:
    timestamp  // The time that this status is relevant to
    person_id
    height

我的问题是如何将其用作较大查询的一部分?

例如-我想让所有人的最新身高大于8

我想可以在查询中使用视图或只使用查询。

我使用的是Django,但我愿意将其编写为普通的SQL查询,并且必须使用Django的ORM

2 个答案:

答案 0 :(得分:1)

我只使用相关子查询:

select hs.*
from heightstatus hs
where hs.timestamp = (select max(hs2.timestamp) from heightstatus hs2 where hs2.person_id = hs.person_id);

答案 1 :(得分:0)

如果您使用的是Sqlite 3.25或更高版本,则窗口函数可提供一种优雅的解决方案:

WITH bytimes AS (SELECT id, name, timestamp, height
                      , rank() OVER (PARTITION BY id ORDER BY timestamp DESC) AS rank
                 FROM person JOIN heightstatus ON id = person_id)
SELECT * FROM bytimes WHERE rank = 1 AND height > 8;