2016-11-18 37 views
3

我正在努力加入别名命名列。总的来说,我想要一个带有日期,小时,以及实际和预测的输出(最近一天早上10点前)风速。加入别名列SQL

有了下面的代码我得到:

ERROR: column "date" does not exist
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) 
+2

为什么MySQL的标签? – Strawberry

+0

错误修复。 @Strawberry – otterdog2000

+1

'... date_trunc('day',meso.timestmp):: date = Foredate AND ...'?除了'group'和'order'子句外,不可能使用列的别名。 – Abelisto

回答

3

'日期' 别名不能从那里看到。

您可以在WITH后使用很少的表格,所以我会建议您在此选择第二个选择。

我不是完全地肯定weather.meso表结构,而是由guesing根据您的查询,这应该工作:

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

+1

它不太有用,但有助于我的理解。我得到一个错误,表示在tmp中缺少表“forecast_prep”的FROM子句。添加之后,说tmp中的所有这些选择都需要位于GROUP BY子句中。 – otterdog2000

+0

你说得对。我错过了这一点,但修复了最新的编辑;) –

+0

另外,因为我不知道表中的所有列名,所以我改变了一点SELECT以避免模糊的列命名问题。 –