sql - 如何使用 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';
我现在正在获取记录,更改了日期格式。
但是有没有办法优化这个查询。?当记录数量众多时,这样的执行需要时间。
解决方案
您的日期没有 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
推荐阅读
- r - 使用多变量列条件过滤观察
- console - 我可以为两个独立的 Python 代码提供两个独立的 Spyder 控制台吗?
- visual-studio - Can Visual Studio use an .editorconfig not in the directory hierarchy?
- javascript - 如何使用 es6 的动态导入从静态导入模块?
- c - Unix(Mac OS)终端不将 Ctrl+D 视为 EOF
- time-complexity - 以下代码循环的时间复杂度?
- c# - Linq 在运行时根据列表中的属性名称选择属性
- angular - 使用 Nativescript cli 创建组件时出错
- containers - Openshift + Tomcat9 + JSF -> jsf.application.resource.unable_to_create_compression_directory
- android - 如何通过在 AnimatedBuilder 中点击来关闭带有 Dismissible 小部件的项目?