Вставить несколько строк из результата Среднее по дате и идентификатору - PullRequest
0 голосов
/ 31 мая 2019

У меня есть таблица с 1 результатом в день, например:

id |  item_id  | date       | amount
-------------------------------------
1       1        2019-01-01     1  
2       1        2019-01-02     2
3       1        2019-01-03     3
4       1        2019-01-04     4
5       1        2019-01-05     5
6       2        2019-01-01     1
7       2        2019-01-01     2
8       2        2019-01-01     3
9       2        2019-01-01     4
10      2        2019-01-01     5
11      3        2019-01-01     1
12      3        2019-01-01     2
13      3        2019-01-01     3
14      3        2019-01-01     4
15      3        2019-01-01     5 

Сначала я пытался усреднить количество столбцов за каждый день.

SELECT 
    x.item_id AS id,avg(x.amount) AS result 
FROM
    (SELECT 
         il.item_id, il.amount,  
         ROW_NUMBER() OVER (PARTITION BY il.item_id  ORDER BY il.date DESC) rn 
     FROM 
         item_prices il) x 
WHERE 
    x.rn BETWEEN 1 AND 50 
GROUP BY 
    x.item_id

Результат будет следующим, если рассчитать на 2019-01-05

item_id |  average
   1         3
   2         3
   3         3

или, если рассчитано, 2019-01-04

item_id |  average
   1         2.5
   2         2.5
   3         2.5

Моя цель - каждый день запускать запрос Среднее, который автоматически обновляет среднее и вставит его в 5-й столбец «среднее»:

id |  item_id  | date       | amount | average
5       1        2019-01-05     5        3
10      2        2019-01-05     5        3
15      3        2019-01-05     5        3

Проблема в том, что в каждом примере, который я могу найти с помощью Вставки выбора, они обновляют только одну строку, и они находятся над другой таблицей, также существует самая последняя проблема с датой ...

Может ли кто-нибудь указать мне правильное направление?

1 Ответ

1 голос
/ 31 мая 2019

Возможно, вы хотите видеть скользящее среднее значение каждый день. Хранение значения в виде отдельного столбца обязательно вызовет проблемы, особенно когда строки обновляются / удаляются, столбец также должен быть обновлен и, следовательно, потребует сложных триггеров.

Просто создайте View и запускайте всякий раз, когда вы хотите проверить среднее значение непосредственно из этого View.

CREATE OR REPLACE VIEW v_item_prices AS
SELECT t.*,avg(t.amount) OVER ( PARTITION BY item_id order by date) 
  AS average FROM item_prices t
  order by item_id,date

DEMO

...