База данных: выберите последние ненулевые записи

Вот вопрос, над которым я ломал голову. Допустим, у меня есть таблица с серией временных меток и номером детали в качестве первичного ключа. В таблице хранятся инкрементные изменения, что означает, что для каждой временной метки, если поле изменяется, это изменение записывается. Если поле не меняется, то для новой отметки времени оно равно NULL. Вот основная идея.

 part | timestamp | x-pos | y-pos | status
------+-----------+-------+-------+--------
 a5   |       151 |     5 |    15 |      g
 a5   |       153 |  NULL |    17 |   NULL

(часть, отметка времени) - это первичный ключ. 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. Но я застрял и не могу этого понять. У кого-нибудь есть идея?

И нет, я не могу изменить структуру базы данных.

РЕДАКТИРОВАТЬ: у ruakh правильная идея. Единственная проблема сейчас - это группировка по частям. Кажется, я не могу обойти LIMIT 1 для группировки по нескольким частям. Любые идеи?

мдальман, я не слишком знаком с аналитическими функциями в postgresql.Итак, если это решение будет проще, чем сложный запрос, обязательно опубликуйте свою идею.

РЕДАКТИРОВАТЬ 2: Спасибо всем за помощь. Думаю, я достаточно хорошо понимаю, что мне нужно делать.

12
задан Bat Masterson 23 January 2012 в 20:40
поделиться