SQL - 基于SELECT结果使用Column插入

时间:2014-04-03 11:10:59

标签: sql hive

我目前有一个名为tempHouses的表格,如下所示:

avgprice | dates | city

日期存储为yyyy-mm-dd

但是我需要将该表中的记录移动到名为houses的表中,如下所示:

city | year2002 | year2003 | year2004 | year2005 | year2006

tempHouses中的信息包含1995年至2014年的平均房价。

我知道我可以使用SUBSTRING从日期中获取年份:

SUBSTRING(dates, 0, 4)

所以基本上对于tempHouses.city中的每个城市,我需要将上述年份的平均房价变为一个记录。

关于如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:1)

这是一种SQL Server方法,PIVOT可能更好,但这是一种方式:

 SELECT City,
        AVG(year2002) AS year2002,
        AVG(year2003) AS year2003,
        AVG(year2004) AS year2004
   FROM (
         SELECT City,
                CASE WHEN Dates BETWEEN '2002-01-01T00:00:00' AND '2002-12-31T23:59:59' THEN avgprice
                     ELSE 0
                END AS year2002,
                CASE WHEN Dates BETWEEN '2003-01-01T00:00:00' AND '2003-12-31T23:59:59' THEN avgprice
                     ELSE 0
                END AS year2003
                CASE WHEN Dates BETWEEN '2004-01-01T00:00:00' AND '2004-12-31T23:59:59' THEN avgprice
                     ELSE 0
                END AS year2004
                -- Repeat for each year
        )
  GROUP BY City

内部查询将数据转换为每条记录的正确格式(City, year2002, year2003, year2004),而外部查询获取每个城市的平均值。

有许多方法可以做到这一点,而性能可能是决定选择的决定因素。

答案 1 :(得分:0)

最好的方法是使用脚本为您执行查询执行,因为您需要多次运行它并根据年份提取数据。确保唯一需要的列是city&行ID:

http://dev.mysql.com/doc/refman/5.0/en/insert-select.html

INSERT INTO <table> (city) VALUES SELECT DISTINCT `city` from <old_table>;

然后为每个城市提取平均值,将它们插入临时表中,然后插入主表。

SELECT avg(price), substring(dates, 0, 4) dates from <old_table> GROUP BY dates;

否则,您正在查看使用联接和潜在联合的组合查询来推断数据。因为你将每个城市的桌子整理成一排,所以这样做有点难度。如果您不希望数据库查询因内存限制而失败,或者只是需要很长时间才能执行,那么您应该首先在日期列上创建索引。