2015-06-26 2 views
0

У меня есть вход как:разница в цене на основе недели Даты

+-----+---------+-------+------------+------------+ 
| key | company | price | week_start | price_diff | 
+-----+---------+-------+------------+------------+ 
| 123 | xxx  | 15 | 02-06-2015 |   | 
| 456 | xxx  | 20 | 02-06-2015 |   | 
| 789 | yyy  | 30 | 02-06-2015 |   | 
| 122 | zzz  | 40 | 02-06-2015 |   | 
| 123 | xxx  | 50 | 09-06-2015 |   | 
| 456 | xxx  | 60 | 09-06-2015 |   | 
| 333 | yyy  | 70 | 09-06-2015 |   | 
+-----+---------+-------+------------+------------+ 

ожидается выход:

обновление колонки price_diff

+-----+---------+-------+------------+------------+ 
| key | company | price | week_start | price_diff | 
+-----+---------+-------+------------+------------+ 
| 123 | xxx  | 15 | 02-06-2015 |   | 
| 456 | xxx  | 20 | 02-06-2015 |   | 
| 789 | yyy  | 30 | 02-06-2015 |   | 
| 122 | zzz  | 40 | 02-06-2015 |   | 
| 123 | xxx  | 50 | 09-06-2015 |   35 | 
| 456 | xxx  | 60 | 09-06-2015 |   40 | 
| 333 | yyy  | 70 | 09-06-2015 |   | 
+-----+---------+-------+------------+------------+ 

для company= 'xxx' и key = 123 я хочу взять цену разница на основе week_start. Из приведенного выше ввода для company = 'xxx' и key = 123, вторая неделя имеет price = 50 и стоимость первой недели = 15. Мне нужно обновить price_diff с разницей этих двух значений.

Заранее спасибо

+0

Как насчет 'y'? Есть только 2 недели? Всегда ли они нравятся 02 --- 09 --- 16 ... или может быть 02 --- 04 --- 07 --- 10 --- 16 ...? –

+0

Спасибо за ответ .. у меня много недель, это будет всегда как 02 --- 09 --- 16 .. и я хочу обновить price_diff неделю до недели и только для компании = 'xxx' – Rajesh

ответ

0

, как вы должны действовать, чтобы сделать self-join, что означает вступление в таблицу с собой на основании разницы 1 недели между датами той же компании и идентификаторов компании.

В моем нижнем запросе я также добавил JOIN на KEY, так как эта логика, по-видимому, будет отображать ваши данные, но я не рекомендую использовать повторяющиеся значения KEY, если это столбец, который должен содержать уникальные значения (в случае, если вы 'не использовать составной ключ).

Но в любом случае, вот что вы можете попробовать (если предположить, что ваша таблица называется "prices"):

SELECT p1.* 
    , p1.price - p2.price AS 'price_diff' 
FROM prices p1 
    LEFT JOIN prices p2 ON p1.company = p2.company 
     AND p2.week_start = p1.week_start - 7 * INTERVAL '1 day' 
     AND p1.KEY = p2.KEY 
ORDER BY p1.week_start, p1.company, p1.KEY 

Кроме того, образец работает SQLFiddle.

Update:

Для того, чтобы обновить price_diff колонку, основываясь на моем выше запросе вы должны изменить его на UPDATE, как показано ниже:

UPDATE prices 
    SET price_diff = p1.price - p2.price 
FROM prices p1 
    LEFT JOIN prices p2 ON p1.company = p2.company 
     AND p2.week_start = p1.week_start - 7 * INTERVAL '1 day' 
     AND p1.KEY = p2.KEY 
+0

Спасибо за ваш ответ .. Я хочу обновить столбец price_diff – Rajesh

+0

У меня ошибка при обновлении Error: Целевая таблица должна быть частью предиката equijoin. Я использую Postgres – Rajesh

+0

@kr_kr Используете ли вы Amazon Redshift? –

0

Вы можете сделать это с функция окна:

WITH diff (key, company, week_start, price) AS (
    SELECT key, company, week_start, 
     price - lag(price) OVER (PARTITION BY key, company ORDER BY week_start) 
    FROM mytable) 
UPDATE mytable 
SET price_diff = diff.price 
FROM diff 
WHERE company = 'xxx' AND diff.company = 'xxx' 
    AND key = 123 AND diff.key = 123 
    AND week_start = diff.week_start; 
+0

Ваш запрос дает мне синтаксическую ошибку. У вас есть дополнительный апостроф до 'diff.key = 123'. –

+0

Ах, скопируйте и вставьте ошибку, спасибо за это. Исправленный. – Patrick

+0

@Patrick: Спасибо за ваше повторение – Rajesh

0
update mytable 
set price_diff = price - (
    select price 
    from mytable as t2 
    where 
     and t2.key = k1.key and t2.company = 'xxx' 
     and t2.week_start = mytable.week_start - 7 * INTERVAL '1 day' 
    ) 
where company = 'xxx' and price_diff is null 
Смежные вопросы