Вот вопрос, который я переживаю. Скажем, у меня есть таблица с серией временных меток и номер детали в качестве первичного ключа. В таблице хранятся инкрементные изменения, что означает, что для каждой отметки времени, если поле изменяется, это изменение записывается. Если поле не изменяется, то для новой метки времени оно равно NULL. Вот основная идея.
part | timestamp | x-pos | y-pos | status
------+-----------+-------+-------+--------
a5 | 151 | 5 | 15 | g
a5 | 153 | NULL | 17 | NULL
(part, timestamp)
является основным ключом. NULL
во второй записи указывают значения, которые не изменяются со времени первой записи.
То, что я хочу сделать, - это выбрать самые последние значения для каждого поля, сгруппированного по части. Например, учитывая приведенные выше записи, результаты будут 153,5,17, g для части a5.
На данный момент у меня есть этот взломанный запрос.
((SELECT x-pos FROM part_changes WHERE x-pos IS NOT NULL
ORDER BY timestamp DESC
LIMIT 1)
UNION
(SELECT y-pos FROM part_changesWHERE y-pos IS NOT NULL
ORDER BY timestamp DESC
LIMIT 1)
UNION
(SELECT status FROM part_changes WHERE status IS NOT NULL
ORDER BY timestamp DESC
LIMIT 1))
Но это возвращает один столбец, что означает, что я могу использовать групповое для организации.
Там должен быть более элегантный способ делать вещи, например, используя COALESCE или IS NULL творческим способом. Но я застрял и не могу понять. У кого-нибудь появилась идея?
И нет, я не могу изменить структуру базы данных.
РЕДАКТОР: Руах имеет правильную идею. Единственная проблема теперь заключается в группировке по частям. Кажется, я не могу обойти LIMIT 1
для группировки несколькими частями. Есть идеи?
mdahlman, я не слишком хорошо знаком с аналитическими функциями в postgresql. Таким образом, если это решение было бы проще, чем сложный запрос, то обязательно отправьте свою идею.
РЕДАКТИРОВАТЬ 2: Спасибо всем за помощь. Я думаю, что у меня есть достаточно хорошее представление о том, что мне нужно делать.