2016-07-15 5 views
0

У меня есть таблица данных, которая находится в метке времени с форматом часового пояса (называется «время»). У меня также есть пустая таблица, которая принимает значения типа данных интервала. Для каждой строки в пустой таблице я хочу вставить разность интервалов между меткой времени этой строки в исходных данных и общим минимальным значением временной метки в исходных данных. Я пытаюсь сделать что-то вроде этого:Получите разницу каждого значения от общего минимального значения в Postgres

INSERT INTO 
    time_pyramid 
SELECT 
    "time" - MIN("time") 
FROM 
    time_raw; 

Но он говорит мне «ОШИБКА: колонка„time_raw.time“должен появиться в GROUP BY оговорки или использоваться в агрегатной функции». Я знаю, что я хочу, чтобы разница между интервалами между значениями временной метки и минимальной отметки таблицы была минимальной, а «время» не будет иметь повторяющиеся значения из этого интервала, поэтому я действительно не думаю, что я должен использовать GROUP BY в этом контексте , Я также не вижу причин использовать функцию агрегации в первом «времени», так как я могу исправить свой запрос, чтобы отразить то, что я хочу?

Edit: На самом деле, «Получить каждое значение в качестве своего интервала отличия от мин» является лучшим названием для этого вопроса

ответ

1

Использование min() как window function:

with time_raw("time") as (
    values 
     ('2016-01-11'::timestamp), 
     ('2016-01-01'::timestamp), 
     ('2016-01-21'::timestamp) 
) 

select 
    "time"- min("time") over() as interval 
from 
    time_raw; 

interval 
---------- 
10 days 
00:00:00 
20 days 
(3 rows) 
+0

Wow я думаю, мне придется читать функции окна. Спасибо, это то, что мне нужно. – Ben

+0

Обратите внимание, что 'min (" time ") over()' синтаксически неделимо. Используйте '(extract (epoch from« time »- min (« time ») over()) * 1000000) :: bigint'. – klin

+0

Да, я обнаружил, что перевернул() внутрь, перемещая круглые скобки. Мне будет хорошо помнить, чтобы привязать функцию окна к совокупности. – Ben