Как получить самый последний элемент по дате в группе по предложению - PullRequest
0 голосов
/ 25 марта 2019

Я выполняю следующий запрос, чтобы получить самую последнюю запись на основе даты

select myItem,to_timestamp(my_date/1000) 
from history_table
where to_timestamp(sign_date/1000)::date >= '2019-01-01' 
    and myItem = 'SomeItem' 
group by myItem,to_timestamp(my_date/1000) 
order by to_timestamp(my_date/1000) 
DESC LIMIT 1;

Это возвращает данные как это:

         myItem          |      to_timestamp
----------------------+------------------------
 SomeItem                | 2019-02-20 15:37:57+00
(1 row)

Но если я уберу LIMIT 1, то получу это:

         myItem          |      to_timestamp
----------------------+------------------------
 SomeItem             | 2019-02-20 15:37:57+00
 SomeItem             | 2019-02-15 13:47:43+00
 SomeItem             | 2019-02-08 19:02:57+00
 SomeItem             | 2019-02-08 12:42:34+00
 SomeItem             | 2019-02-07 21:07:16+00
 SomeItem             | 2019-02-07 21:04:26+00
 SomeItem             | 2019-02-04 22:01:42+00
(7 rows)

Вопрос

Я хотел бы удалить предложение myItem = 'SomeItem', чтобы получить самую последнюю запись для каждого элемента на основе my_date. Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 25 марта 2019

Попробуйте использовать MAX(to_timestamp(my_date/1000)), запрос:

select myItem, MAX(to_timestamp(my_date/1000))
from history_table
where to_timestamp(sign_date/1000)::date >= '2019-01-01'9 
group by myItem
order by myitem;
1 голос
/ 25 марта 2019
  1. Вы не должны группировать по дате.Только ваш предмет должен определять группу.
  2. И не конвертируйте значение всего max, потому что оно выполняет его для каждой строки в группе и после этого определяет max.Конвертировать только максимальное значение - оно должно быть быстрее

В T-Sql:

select
    myItem,
    to_timestamp(MAX(my_date)/1000) as my_date_Timestamp
from history_table
Group by myItem
Order by my_date_Timestamp DESC
1 голос
/ 25 марта 2019

В PostgreSQL вы используете для этого DISTINCT ON:

select distinct on (myItem) myItem, to_timestamp(my_date/1000)
from history_table
where to_timestamp(sign_date/1000)::date >= date '2019-01-01' 
order by myItem, to_timestamp(my_date/1000) desc;

Вы можете добавить больше столбцов к предложению select, так как вы получаете последнюю строку для каждого элемента.

РЕДАКТИРОВАТЬ: Если это просто показать максимальную дату на myitem, я бы пошел с ответом Кристиана.Мое решение подходит, когда в таблице есть еще столбцы, которые вы хотите показать.

...