2014-11-06 4 views
1

У меня есть две объединенные таблицы, родительский показывает имя устройства, дочерние показывает температуры записи, которые могут быть вставлены либо автоматическим процессом (AUTO), либо пользователем. Таким образом, для данных чтения единицы измерения с простого соединения будет выглядеть так:Выберите последние из объединенной таблицы, исключая дубликаты

UNIT  TEMP  TIMESTAMP  DATA_SOURCE 
ABC  -20  10:26   AUTO 
ABC  -19  11:27   USER 
ABC  -19  11:27   AUTO 

Целью является выбор последнего показания температуры. Я могу использовать подзапрос сделать так:

SELECT A.UNIT, B.TEMP, B.TIMESTAMP,B.DATA_SOURCE 
    FROM units_table A left outer join readings_table B on A.Gkey=B.unit_gkey 
    WHERE B.TIMESTAMP= 
      (SELECT MAX(TIMESTAMP) FROM readings_table B1 
      WHERE A.Gkey=B1.unit_gkey)  

Было бы просто, но в приведенном выше примере есть две точные метки времени, так что я буду получать два чтения. В таком случае я бы хотел проигнорировать источник AUTO. Есть ли элегантный способ сделать это?

Edit: быть ясно, что я хочу только результат одна строка: ABC -19 11:27 USER

ответ

2

Вы можете сделать это с row_number() вместо:

SELECT ut.UNIT, rt.TEMP, rt.TIMESTAMP, rt.DATA_SOURCE 
FROM units_table ut left outer join 
    (SELECT rt.*, 
      row_number() over (partition by rt.unit_Gkey 
           order by timestamp desc, 
             (case when rt.data_source = 'AUTO' then 1 else 0 end) 
           ) as seqnm 
     FROM readings_table rt 
    ) rt 
    on rt.unit_Gkey = ut.gkey 
WHERE rt.seqnum = 1; 

Примечание: если вы хотите, дубликаты, вы должны использовать rank() или dense_rank() вместо row_number() (и удалить второе предложение в order by).

+0

Редактировать: nevermind, его работа только вы ошиблись в соединении :) 'rt.unit_gkey = ut.gkey' – Yasskier

0

http://www.w3schools.com/sql/sql_distinct.asp

просто использовать отдельный ключ слово посмотрите на пример! :)

+0

Проблема заключается в том, что существуют различные строки (потому что разные DATA _SOURCES)! И я хочу игнорировать один из них в случае, если запрос q смог произвести более одного результата. – Yasskier

Смежные вопросы