价格差异基于周日期

时间:2015-06-26 08:06:37

标签: sql postgresql

我的输入如下:

+-----+---------+-------+------------+------------+
| 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。

提前致谢

3 个答案:

答案 0 :(得分:0)

您应该采取的方式是self-join,这意味着根据同一公司的日期与公司的ID之间的1周差异加入表格。

在我的下面查询中,我还在KEY上添加了一个JOIN,因为这个逻辑显然会映射您的数据,但我不建议使用重复的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

<强>更新

为了更新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

答案 1 :(得分: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;

答案 2 :(得分: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
相关问题