加入别名列SQL

时间:2016-11-18 19:52:10

标签: postgresql join

我正在努力加入别名命名列。总的来说,我希望输出带有日期,小时,实际和预测(最近一天上午10点之前)的风速。

使用以下代码我得到:

  

错误:列“日期”不存在
  LINE xx:... ast_prep.lat AND meso.lon = forecast_prep.lon AND Date ...

我无法弄清楚如何让SQL加入这些命名列 谢谢。是的,我是一个SQL新手。

with forecast_prep as (
  SELECT
    date_trunc('day', foretime)::date AS Foredate,
    extract(hour from foretime)+1 AS foreHE, 
    lat,
    lon,
    windspeed,
    max(as_of) AS as_of
  FROM weather.forecast
  WHERE date_trunc('day', foretime)::date-as_of>= interval '16 hours'
  GROUP BY Foredate, foreHE, lat, lon, windspeed)
SELECT
  meso.station,
  date_trunc('day', meso.timestmp)::date AS Date,
  extract(hour from meso.timestmp)+1 AS HE, 
  CAST(AVG(meso.windspd) as numeric(19,2)) As Actual,
  forecast_prep.windspeed, 
  forecast_prep.as_of
FROM weather.meso
  INNER JOIN forecast_prep ON (
    meso.lat = forecast_prep.lat AND
    meso.lon = forecast_prep.lon AND
    Date = Foredate AND ----<<<< Error here
    HE = foreHE)
WHERE
  (meso.timestmp Between '2016-02-01' And '2016-02-02') AND
  (meso.station='KSBN')
GROUP BY meso.station, Date, HE, forecast_prep.windspeed, forecast_prep.as_of
ORDER BY Date, HE ASC

以下是表结构:

-- Table: weather.forecast

-- DROP TABLE weather.forecast;

CREATE TABLE weather.forecast
(
  foretime timestamp without time zone NOT NULL,
  as_of timestamp without time zone NOT NULL, -- in UTC
  summary text,
  precipintensity numeric(8,4),
  precipprob numeric(2,2),
  temperature numeric(5,2),
  apptemp numeric(5,2),
  dewpoint numeric(5,2),
  humidity numeric(2,2),
  windspeed numeric(5,2),
  windbearing numeric(4,1),
  visibility numeric(5,2),
  cloudcover numeric(4,2),
  pressure numeric(6,2),
  ozone numeric(5,2),
  preciptype text,
  lat numeric(8,6) NOT NULL,
  lon numeric(9,6) NOT NULL,
  CONSTRAINT forecast_pkey PRIMARY KEY (foretime, as_of, lat, lon)


-- Table: weather.meso

-- DROP TABLE weather.meso;

CREATE TABLE weather.meso
(
  timestmp timestamp without time zone NOT NULL,
  station text NOT NULL,
  lat numeric NOT NULL,
  lon numeric NOT NULL,
  tmp numeric,
  hum numeric,
  windspd numeric,
  winddir integer,
  dew numeric,
  CONSTRAINT meso_pkey PRIMARY KEY (timestmp, station, lat, lon)

1 个答案:

答案 0 :(得分:3)

从那里看不到

'Date'别名。

你可以在WITH之后使用几张桌子,所以我建议你在那里进行第二次选择。

我不完全确定weather.meso表结构,但根据你的查询猜测,这应该有效:

WITH
    forecast_prep AS (
        SELECT
              date_trunc('day', foretime) :: DATE AS Foredate,
              extract(HOUR FROM foretime) + 1     AS foreHE,
              lat,
              lon,
              max(windspeed) as windspeed,
              max(as_of)                          AS as_of
        FROM weather.forecast
        WHERE date_trunc('day', foretime) :: DATE - as_of >= INTERVAL '16 hours'
        GROUP BY Foredate, foreHE, lat, lon
   ),
   tmp AS (
      SELECT
        meso.station,
        meso.lat,
        meso.lon,
        meso.timestmp,
        date_trunc('day', meso.timestmp) :: DATE  AS Date,
        extract(HOUR FROM meso.timestmp) + 1      AS HE,
        CAST(AVG(meso.windspd) AS NUMERIC(19, 2)) AS Actual
      FROM weather.meso
      GROUP BY station, lat, lon, timestmp, Date, HE
   )
SELECT 
    tmp.station, tmp.Date, tmp.HE, tmp.Actual, forecast_prep.windspeed, forecast_prep.as_of
FROM tmp
INNER JOIN forecast_prep ON (
    tmp.lat = forecast_prep.lat 
    AND tmp.lon = forecast_prep.lon 
    AND tmp.Date = forecast_prep.Foredate
    AND tmp.HE = forecast_prep.foreHE
)
WHERE 
    (tmp.timestmp BETWEEN '2016-02-01' AND '2016-02-02') 
    AND (tmp.station = 'KSBN')
GROUP BY 
    tmp.station, tmp.Date, tmp.HE, forecast_prep.windspeed, forecast_prep.as_of, tmp.Actual
ORDER BY tmp.Date, tmp.HE ASC;

就像第一个例子一样https://www.postgresql.org/docs/8.4/static/queries-with.html