2016-01-28 5 views
1

У меня есть два файла: apt и registration_history. Второй файл имеет несколько записей , ссылающихся на отдельные записи в apt.Как передать значение записи в подзапрос (PostgreSQL)?

Как получить только последнюю запись в истории назначения, которая ссылается на запись в apt изнутри подзапроса?

Редактировать # 1: Вопрос не столько в том, как группировать, сколько в том, как передать внешнее значение (назначение_recid) в подзапрос, не группируя весь файл_соединения_истории на неиспользуемые имя_события. Поэтому я не думаю, что это дублированный вопрос. (Несмотря на то, что это noobie, может получиться то же самое).

PostgreSQL 9,3

ERROR: invalid reference to FROM-clause entry for table "apt" SQL state: 42P01 Hint: There is an entry for table "apt", but it cannot be referenced from this part of the query.

select apt.*, h.* 
    from apt 
    join appointment_history h on (h.appointment_recid = apt.appointment_recid) 
    join ( 
     select max(tposted) as tposted 
     from appointment_history a 
     where a.appointment_recid = apt.appointment_recid) currenthx 
    on (currenthx.tposted = h.tposted) 

ТИА

+0

Можете ли вы поделиться некоторыми данными примера и результатом, который вы пытаетесь получить за это? – Mureinik

+0

Вы имеете в виду две таблицы или два файла? –

+0

Возможный дубликат [Выбрать первую строку в каждой группе GROUP BY?] (Http://stackoverflow.com/questions/3800551/select-first-row-in-each-group-by-group) – pozs

ответ

1
select apt.*, h.* 
    from apt 
    join appointment_history h 
     on (h.appointment_recid = apt.appointment_recid) 
    join ( 
      SELECT appointment_recid, max(tposted) as tposted 
      FROM appointment_history a 
      GROUP BY appointment_recid -- ADD GROUP BY 
     ) currenthx 
     on currenthx.tposted = h.tposted 
    and currenthx.appointment_recid = a.appointment_recid -- JOIN OUTSIDE 

Для запроса

select apt.*, h.* 
    from apt 
    join appointment_history h 
     on (h.appointment_recid = apt.appointment_recid) 
    join ( 
      SELECT appointment_recid, max(tposted) as tposted 
      FROM appointment_history a 
      JOIN apt ap 
       on (h.appointment_recid = ap.appointment_recid)    
      GROUP BY appointment_recid -- ADD GROUP BY 
     ) currenthx 
     on currenthx.tposted = h.tposted 
    and currenthx.appointment_recid = a.appointment_recid -- JOIN OUTSIDE 
+0

Мне кажется расточительным то, что вся таблица истории встреч (500 000 записей) должна быть сгруппирована только для 3 необходимых записей - если PostgreSQL каким-то образом оптимизирует это. ??? Благодарю. –

+0

Вы всегда можете создать 'JOIN' внутри, но используя другой псевдоним, так что только группируйте строки, созданные на' JOIN' –

+0

Извините ... Вы потеряли меня, как мне это сделать? –

1

В отсутствие подробной информации таблицы, это, вероятно, решает проблему:

SELECT apt.*, h.* 
FROM apt 
JOIN (
    SELECT <columns>, max(tposted) AS tposted 
    FROM appointment_history 
    GROUP BY <columns>) h USING (appointment_recid); 
+0

... + 1 для демонстрации предложения USING этому noobie. Благодарю. Группировка по всем столбцам не даст мне самую последнюю запись, однако, когда я хочу только те записи для определенного назначения_recid. –