我的输入如下:
+-----+---------+-------+------------+------------+
| 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 :(得分: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