如何解决按时间对具有相同数据的单独分区进行红移
我在Redshift表中有数据,例如product_id,price和time_of_purchase。自上次购买以来,每次价格更改时,我都想创建分区。在这种情况下,某件商品的价格可能会回到之前的价格,但是我需要将其作为一个单独的分区,例如:
请注意,价格为2美元,然后升至3美元,然后又回到2美元。如果我做类似的事情(按product_id划分,按time_of_purchase划分价格顺序),那么最后一行将被前两个分区,这是我所不希望的。如何正确执行此操作,以便获得三个单独的分区?
解决方法
使用lag()
来获取先前的值,然后是一个累加的总和:
select t.*,sum(case when prev_price = price then 0 else 1 end) over
(partition by product_id order by time_of_purchase) as partition_id
from (select t.*,lag(price) over (partition by product_id order by time_of_purchase) as prev_price
from t
) t
,
与@Gordon Linoff相比,我更喜欢使用WITH子句逐步进行操作...
而且,正如我在其他帖子中多次提到的那样-请以可复制粘贴的格式添加您的示例数据,因此我们不必复制粘贴您的示例。
我想以独立的微演示格式添加示例,并在帖子中输入数据,以便所有人都可以使用,这就是为什么..
WITH
-- your input,typed manually ....
indata(product_id,price,tm_of_p) AS (
SELECT 1,2.00,TIMESTAMP '2020-09-14 09:00'
UNION ALL SELECT 1,TIMESTAMP '2020-09-14 10:00'
UNION ALL SELECT 1,3.00,TIMESTAMP '2020-09-14 11:00'
UNION ALL SELECT 1,TIMESTAMP '2020-09-14 12:00'
UNION ALL SELECT 1,TIMESTAMP '2020-09-14 13:00'
),with_change_counter AS (
SELECT
*,CASE WHEN LAG(price) OVER(PARTITION BY product_id ORDER BY tm_of_p) <> price
THEN 1
ELSE 0
END AS chg_count
FROM indata
)
SELECT
product_id,tm_of_p,SUM(chg_count) OVER(PARTITION BY product_id ORDER BY tm_of_p) AS session_id
FROM with_change_counter;
-- out product_id | price | tm_of_p | session_id
-- out ------------+-------+---------------------+------------
-- out 1 | 2.00 | 2020-09-14 09:00:00 | 0
-- out 1 | 2.00 | 2020-09-14 10:00:00 | 0
-- out 1 | 3.00 | 2020-09-14 11:00:00 | 1
-- out 1 | 3.00 | 2020-09-14 12:00:00 | 1
-- out 1 | 2.00 | 2020-09-14 13:00:00 | 2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。