получить последние данные из таблицы кустов с несколькими столбцами разделов - PullRequest
2 голосов
/ 10 января 2020

У меня есть таблица улья со структурой ниже

ID string,
Value string,
year int,
month int,
day int,
hour int,
minute int

Эта таблица обновляется каждые 15 минут и разбивается на столбцы год / месяц / день / час / минута. Ниже приведены примеры разделов.

year=2019/month=12/day=29/hour=19/minute=15
year=2019/month=12/day=30/hour=00/minute=45
year=2019/month=12/day=30/hour=08/minute=45
year=2019/month=12/day=30/hour=09/minute=30
year=2019/month=12/day=30/hour=09/minute=45

Я хочу выбрать только самые последние данные раздела из таблицы. Я пытался использовать операторы max () с этими столбцами разделов, но это не очень эффективно, так как размер данных огромен. Пожалуйста, дайте мне знать, как я могу получить данные удобным способом, используя улей sql.

1 Ответ

1 голос
/ 10 января 2020

Если последний раздел всегда находится в текущей дате, вы можете отфильтровать текущий раздел даты и использовать rank (), чтобы найти записи с последним часом, минутой:

select * --list columns here
from
(
select s.*, rank() over(order by hour desc, minute desc) rnk
  from your_table s
 where s.year=year(current_date)   --filter current day (better pass variables calculated if possible)
   and s.month=lpad(month(current_date),2,0) 
   and s.day=lpad(day(current_date),2,0)
   -- and s.hour=lpad(hour(current_timestamp),2,0) --consider also adding this
) s 
where rnk=1 --latest hour, minute

И если последний раздел не является обязательно равно current_date, тогда вы можете использовать rank() over (order by s.year desc, s.month desc, s.day desc, hour desc, minute desc), без фильтра на дату, это будет сканировать всю таблицу и неэффективно.

Это будет работать лучше, если вы сможете вычислить фильтры разделов в оболочке и передать в качестве параметров , Смотрите комментарии в коде.

...