首页 > 解决方案 > 如何使用 Amazon Redshift 中的垂直列获取记录

问题描述

我需要在两列中给出的日期范围之间获取记录。

我的表结构是这样的:

CREATE TABLE shared
(
   id         integer         NOT NULL,
   product          varchar(50)     NOT NULL,
   parent_id  integer         NOT NULL,
   key_code         varchar(100)    NOT NULL,
   key_value        varchar(8000)
);

INSERT INTO shared
    (`id`, `product`, `parent_id`, 'key_code', 'key_value')
VALUES
    (1, 'a',1, 'start_date','1/7/2011'),
    (2, 'a', 1,'end_date','15/7/2011'),
    (3, 'a',1, 'type','Promotion'),
    (4, 'a',1,'plan', 'new'),
    (5, 'a',5, 'start_date','11/8/2012'),
    (6, 'a', 5,'end_date','15/8/2012'),
    (7, 'a',5, 'type','Promotion'),
    (8, 'a',5,'plan', 'new'),
    (9, 'b',9, 'start_date','15/09/2015'),
    (10, 'b', 9,'end_date','15/09/2016'),
    (11, 'b',9, 'type','Promotion'),
    (12, 'b',9,'plan', 'new'),
;

现在我想获取开始日期>='1/7/2011' 到 start_date<='15/8/2012' 之间的所有记录,其中 product='a'。

我试过的查询是:

SELECT 
    *
FROM
    (SELECT   parent_id,
         product,
          MIN(CASE WHEN key_code = 'key_code' THEN key_value ELSE 'n/a' END) AS key_code,
          MIN(CASE WHEN key_code = 'start_date' THEN key_value ELSE 'n/a' END) AS start_date,
          MIN(CASE WHEN key_code = 'end_date' THEN key_value ELSE 'n/a' END) AS end_date,
          MIN(CASE WHEN key_code = 'type' THEN key_value ELSE 'n/a' END) AS type,
          MIN(CASE WHEN key_code = 'plan' THEN key_value ELSE 'n/a' END) AS plan,
FROM     shared
GROUP BY parent_id,
         product
ORDER BY parent_id) comp
WHERE
    start_date>= '01/12/2011'
        AND start_date <= '02/17/2011' and product='a';

我现在正在获取记录,更改了日期格式。

但是有没有办法优化这个查询。?当记录数量众多时,这样的执行需要时间。

标签: sqlamazon-redshift

解决方案


您的日期没有 MySQL 格式,因此必须将它们转换,以便进行比较

使用 MIN 和 MAX 以及您的 'n/a,最好在内部 Select 中使用 NULL,如果值为 NULL,则在外部分配 Value n/a,否则即使有数据。

SELECT 
    *
FROM
    (SELECT 
        parent_id,
            product,
            MIN(CASE WHEN key_code = 'start_date' THEN key_value ELSE 'n/a' END) AS start_date,
            MIN(CASE WHEN key_code = 'end_date' THEN key_value ELSE 'n/a' END) AS end_date,
            MAX(CASE WHEN key_code = 'type' THEN key_value ELSE 'n/a' END) AS type,
            MAX(CASE WHEN key_code = 'plan' THEN key_value ELSE 'n/a' END) AS plan
    FROM
        shared
    GROUP BY parent_id , product
    ORDER BY parent_id) comp
WHERE
    TO_DATE(start_date, 'DD/MM/YYYY') >= '2011-01-12'
        AND TO_DATE(start_date, 'DD/MM/YYYY') <= '2011-07-17'
        AND product = 'a'
;

这会给你

 parent_id  product  start_date  end_date   type        plan
 1          a        1/7/2011    15/7/2011  Promotion   new

所以 STR:TO:DATE 在 AWS 中不存在,但它存在一个TO_Date 而不是 IF 你必须在你的查询中做 A CASe


推荐阅读