SQL - запрос последнего значения из таблицы для каждого совпадения - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть 2 таблицы, похожие на это:

Person:
    id
    name

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

Возможные значения могут быть

Персона - [1, Джон], [2, Боб], [3, Джениффер]

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

Это означает, что у меня 3 человека, и на момент 100 рост Джона был 5, на момент 150 его рост составлял 7 и т. Д.

запросить последний рост определенного человека легко (например, для человека с идентификатором 1):

select height
from Person, HeightStatus
where Person.id==HeightStatus.person_id and Person.id == 1
order by timestamp desc
limit 1

Моя проблема в том, как использовать это как часть более крупного запроса?

Например, я хочу, чтобы все люди, чей последний рост был больше 8

Полагаю, можно использовать представление или просто использовать запрос в запросе.

Я использую Django, но я открыт для написания этого в виде простого SQL-запроса и обязательно с использованием ORM * Django

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Если вы используете 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;
0 голосов
/ 08 ноября 2018

Я бы просто использовал коррелированный подзапрос:

select hs.*
from heightstatus hs
where hs.timestamp = (select max(hs2.timestamp) from heightstatus hs2 where hs2.person_id = hs.person_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...