如何使用垂直列获取记录 [英] How to fetch records using vertical columns
本文介绍了如何使用垂直列获取记录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要在两列中给定的日期范围之间提取记录。
我的表结构如下:
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,最好在内部选择中使用NULL,如果值为NULL,则在外部赋值n/a,否则即使有数据也会获得n/QA。
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
So STR:TO:DATE在AWS中不存在,但它存在TO_Date
而不是在查询中强制执行案例
这篇关于如何使用垂直列获取记录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文