首页 > 解决方案 > REDSHIFT:根据另一列中的某个值更改列中的值

问题描述

DB-小提琴

CREATE TABLE customers (
    id SERIAL PRIMARY KEY,
    order_date DATE,
    country VARCHAR(255),
    customer VARCHAR(255)
);

INSERT INTO customers
(order_date, country, customer)
VALUES 
('2020-04-10', 'DE', 'user_01'),
('2020-04-11', 'DE', 'user_01'),
('2020-04-13', 'AT', 'user_01'),

('2020-04-20', 'AT', 'user_02'),
('2020-04-22', 'AT', 'user_02'),

('2020-05-19', 'DE', 'user_03'),

('2020-06-17', 'AT', 'user_04'),
('2020-06-23', 'AT', 'user_04'),
('2020-07-04', 'DE', 'user_04'),

('2020-08-19', 'NL', 'user_05'),
('2020-10-23', 'FR', 'user_05');

预期结果:

order_date   |   customer  |      country     |  
-------------|-------------|------------------|--------------------------------
2020-04-10   |   user_01   |       DE         |        
2020-04-11   |   user_01   |       DE         |       
2020-04-13   |   user_01   |       DE         |  --> country changed to DE 
-------------|-------------|------------------|--------------------------------   
2020-04-20   |   user_02   |       AT         |        
2020-04-22   |   user_02   |       AT         |       
-------------|-------------|------------------|-------------------------------- 
2020-05-19   |   user_03   |       DE         |      
-------------|-------------|------------------|--------------------------------
2020-06-17   |   user_04   |       DE         |  --> country changed to DE 
2020-06-23   |   user_04   |       DE         |  --> country changed to DE
2020-07-04   |   user_04   |       DE         |     
-------------|-------------|------------------|--------------------------------
2020-08-19   |   user_05   |       NL         |     
2020-10-23   |   user_05   |       FR         |      

在上面的示例中,可能有一位客户同时在DE和中订购AT
对于那些客户,我想将DE列中的国家/地区分配给country他们的每个order_dates.

参考这个问题的答案之一,我试图这样做:

SELECT
c.order_date AS order_date,
c.customer AS customer,

(CASE WHEN COUNT(*) FILTER (WHERE c.country = 'DE') OVER (PARTITION BY c.customer) > 0
      THEN 'DE' ELSE c.country
      END) AS country
      
FROM customers c
ORDER BY 1,2,3;

但是,在redshiftFILTER功能中不可用。
我如何必须修改查询以使其也可以工作redshift

标签: sqlamazon-redshift

解决方案


SUM(CASE WHEN c.country = 'DE' THEN 1 END) OVER (PARTITION BY c.customer)

这使用分析函数内部CASE的表达式来应用过滤。

  • 任何不符合条件的内容都会返回NULL
  • 聚合有效地跳过NULL

DB Fiddle 两种方法


推荐阅读