2016-02-26 4 views
0

Я пытаюсь выбрать строку с max (date_added), учитывая только повторяющиеся значения в col_a и col_b с log_id является уникальным. Я видел решения с DISTINCT ON и с помощью оконных функций, но я не могу правильно получить синтаксис, чтобы получить результат, который я хочу.Выберите столбец на основе максимальной даты timestamp

Из этой таблицы:

 
+--------+-------+-------+-------+-------+-------+-------------------------+ 
| log_id | col_a | col_b | col_c | col_d | col_e |  date_added  | 
+--------+-------+-------+-------+-------+-------+-------------------------+ 
|  1 | ACME | West | 14 | 27 | A  | 2016-01-01 12:45:00.453 | 
|  2 | ACME | West | 17 | 31 | A  | 2016-01-02 07:33:24.551 | 
|  3 | ACME | East | 13 | 27 | B  | 2016-01-01 11:43:21.223 | 
|  4 | ACME | East | 17 | 28 | A  | 2016-01-03 09:15:50.113 | 
+--------+-------+-------+-------+-------+-------+-------------------------+ 

Как я могу вернуть это:

 
+--------+-------+-------+-------+-------+-------+-------------------------+ 
| log_id | col_a | col_b | col_c | col_d | col_e |  date_added  | 
+--------+-------+-------+-------+-------+-------+-------------------------+ 
|  2 | ACME | West | 17 | 31 | A  | 2016-01-02 07:33:24.551 | 
|  4 | ACME | East | 17 | 28 | A  | 2016-01-03 09:15:50.113 | 
+--------+-------+-------+-------+-------+-------+-------------------------+ 

ответ

0

Использование distinct on просто:

select distinct on (col_a, col_b) 
    * 
from 
    yourtable 
order by 
    col_a, col_b, -- columns from `distinct on` should be in the `order by` clause 
    -- and here is a max value of date_added for every distinct (col_a, col_b) pairs 
    -- because of descending order 
    date_added desc; 
0

один подход заключается в использовании функций окна ... что-то вроде ...

with cte as (SELECTlog_id,col_a,col_b,col_c,col_d, col_e, date_added, 
        row_number() over (partition by col_A, col_B order by date_added desc) rn 
      FROM tableName) 
SELECT log_id,col_a,col_b,col_c,col_d,col_e,date_added 
FROM cte 
WHERE rn = 1; 

То, что это делает, присваивает номер строки каждой группе col_A и col_B (номер строки реселлинга до 1 для каждой группы A, b) в d добавочный порядок даты добавляется, а затем возвращать только те записи с номером строки 1 (с максимальной датой)

или до функций window'd ... мы получаем набор данных для максимальных дат в каждом col_a и Col_B, а затем присоединиться к базовому набору, чтобы ограничить данные.

Select A.* 
FROM TableName A 
INNER JOIN (SELECT max(date_added) mda, col_A, col_B 
      FROM tableName) B 
on B.MDA = A.Date_Added 
and B.Col_A = A.Col_A 
and B.Col_B = A.Col_B 
Смежные вопросы