从两个表中读取数据并写入csv

时间:2016-08-18 06:24:17

标签: java mysql java-ee stored-procedures jdbc

我必须从两个表中读取数据并将其写入csv文件。 表格结构如下:

  1. 压力表。它有96行
  2. 每日天气信息表。它有各个城市的天气信息。
  3. 表结构如下所示。

       1)  pressure_table                              2) Daily Weather Information   
            Date    | TimeStamp   | Pressure           WForecastDate    | TimeStamp   | RegionId  | Temp  | WindSpeed   | Humidity
        -------------------------------------          ---------------------------------
         2016-08-16 | 1           | 1000               2016-08-16      | 1            | 100       |  23   | 123         |23
         2016-08-16 | 2           | 2000               2016-08-16      | 2            | 100       |  24   | 123         |24
         2016-08-16 | 3           | 3500               2016-08-16      | 3            | 100       |  24   | 123         |22
         2016-08-16 | 4           | 4000               2016-08-16      | 4            | 100       |  23   | 123         |21
         2016-08-16 | 5           | 5000               2016-08-16      | 5            | 100       |  25   | 123         |27
         2016-08-16 | 6           | 6000               2016-08-16      | 6            | 100       |  24   | 123         |26
         2016-08-16 | 7           | 7000               2016-08-16      | 7            | 100       |  22   | 123         |27
         2016-08-16 | 8           | 8000               2016-08-16      | 8            | 100       |  21   | 123         |26
         2016-08-16 | 9           | 1200               2016-08-16      | 9            | 100       |  20   | 123         |23
         2016-08-16 | 10          | 1289               2016-08-16      | 1            | 101       |  23   | 123         |22
         2016-08-16 | 11          | 2312               2016-08-16      | 2            | 101       |  22   | 123         |21
         2016-08-16 | 12          | 7878               2016-08-16      | 3            | 101      |  21   | 123         |27
         2016-08-16 | 13          | 7676               2016-08-16      | 4            | 101       |  22   | 123         |25
         2016-08-16 | 14          | 1256               2016-08-16      | 5            | 101       |  21   | 123         |23             
         2016-08-16 | 15          | 5676               2016-08-16      | 6            | 101       |  21   | 123         |24
         ............................                  .................................
         ............................                  .................................
         2016-08-16 | 96          | 6541               
    

    我必须按以下格式创建csv:

    “DATE”, “时间戳”, “压力”, “Temp.100”, “Temp.101”,WindSpeed.100" , “WindSpeed101”,Hum101,Hum102
    “2016年1月8日”,1,234,23,12,12,34,21,22
    “2016年1月8日”,2,233,23,12,12,34,21,22
    “2016年1月8日”,3,121,23,12,12,34,21,22
    “2016年1月8日”,4,124,23,12,12,34,21,22
    “2016年1月8日”,5,123,23,12,12,34,21,22
    “2016年1月8日”,6,126,23,12,12,34,21,22
    “2016年1月8日”,7,893,23,12,12,34,21,22
    .....................................
    共计96个街区
    .....................................
    “2016年1月8日”,96,893,23,12,12,34,21,22

    我需要做的是从 压力表 中获取所有 日期,时间戳和压力 信息即;所有96个时间戳和区域100,101的 温度,湿度和风速 信息以及来自 *每日天气信息* *的相同日期和时间戳* 表格在一行中。

    目前我正在做的是运行以下sql查询。

    SELECT Date,TimeStamp,Pressure FROM load_data_demand where date='2016-08-16'order by Date,TimeStamp;
    

    迭代resultSet并将 Date,TimeStamp和Pressure 附加到文件中,然后执行以下查询以获取区域温度,湿度和风速信息

    SELECT temp,WindSpeed,humidity FROM daily_weather_information where regionId=100 and Wforecastdate='2016-08-16' and timeStamp=1;
    
    SELECT temp,WindSpeed,humidity FROM daily_weather_information where regionId=101 and Wforecastdate='2016-08-16' and timeStamp=1;
    

    将获取的信息附加到文件中。

    我的代码按预期生成csv文件,但运行的查询太多。任何人都可以给我一个查询上面的场景,可以生成查询数量较少或单个查询的结果集。

2 个答案:

答案 0 :(得分:0)

/*
http://stackoverflow.com/questions/39011220/read-data-from-two-tables-and-writing-into-csv
create table pressure_table(`Date` date    , TimeStamp int  , Pressure   int);        
truncate table pressure_table;
insert into pressure_table values        
     ('2016-08-16' , 1           , 1000),              
     ('2016-08-16' , 2           , 2000),              
     ('2016-08-16' , 3           , 3500),               
     ('2016-08-16' , 4           , 4000),               
     ('2016-08-16' , 5           , 5000),               
     ('2016-08-16' , 6           , 6000),              
     ('2016-08-16' , 7           , 7000),              
     ('2016-08-16' , 8           , 8000),              
     ('2016-08-16' , 9           , 1200),               
     ('2016-08-16' , 10          , 1289),              
     ('2016-08-16' , 11          , 2312),               
     ('2016-08-16' , 12          , 7878),               
     ('2016-08-16' , 13          , 7676),              
     ('2016-08-16' , 14          , 1256),                          
     ('2016-08-16' , 15          , 5676);   


create table Daily_Weather_Information(WForecastDate date   , TimeStamp   int, RegionId int , Temp  int, WindSpeed int  , Humidity int);
truncate table daily_weather_information;
insert into daily_weather_information    values 
     ('2016-08-16'      , 1            , 100       ,  23   , 123         ,23),
     ('2016-08-16'      , 2            , 100       ,  24   , 123         ,24),
     ('2016-08-16'      , 3            , 100       ,  24   , 123         ,22),
     ('2016-08-16'      , 4            , 100       ,  23   , 123         ,21),
     ('2016-08-16'      , 5            , 100       ,  25   , 123         ,27),
     ('2016-08-16'      , 6            , 100       ,  24   , 123         ,26),
     ('2016-08-16'      , 7            , 100       ,  22   , 123         ,27),
     ('2016-08-16'      , 8            , 100       ,  21   , 123         ,26),
     ('2016-08-16'      , 9            , 100       ,  20   , 123         ,23),
     ('2016-08-16'      , 1            , 101       ,  23   , 123         ,22),
     ('2016-08-16'      , 2            , 101       ,  22   , 123         ,21),
     ('2016-08-16'      , 3            , 101       ,  21   , 123         ,27),
     ('2016-08-16'      , 4            , 101       ,  22   , 123         ,25),
     ('2016-08-16'      , 5            , 101       ,  21   , 123         ,23),            
     ('2016-08-16'      , 6            , 101       ,  21   , 123         ,24);  
      */  

select p.`date`,p.timestamp,p.pressure,
        max(case when regionid = 100 then temp else 0 end) as temp100,
        max(case when regionid = 101 then temp else 0 end) as temp101,
        max(case when regionid = 100 then windspeed else 0 end) as windspeed100,
        max(case when regionid = 101 then windspeed else 0 end) as windspeed101,
        max(case when regionid = 100 then humidity else 0 end) as humidity100,
        max(case when regionid = 101 then humidity else 0 end) as humidity101
from    pressure_table p
join  daily_weather_information i on i.timestamp = p.timestamp
group by  p.`date`,p.timestamp,p.pressure
order   by  p.`date`,p.timestamp,p.pressure

答案 1 :(得分:-3)

有很多种可能性。如果您尝试通过attribut" date"来加入这两个表格。

所以你可以在一个查询中这样做:

SELECT Date,TimeStamp,Pressure,temp,WindSpeed,humidity FROM 
load_data_demand l, daily_weather_information d
WHERE l.Date = d.WForecastDate 
AND d.timeStamp = 1
AND (d.RegionId = 100 OR d.RegionId=101)
order by l.Date, d.Timestamp