2013-12-19 10 views
0

Что случилось с этим запросом?Подзапрос PostgreSQL не работает

select extract(week from created_at) as week, 
     count(*) as received, 
     (select count(*) from bugs where extract(week from updated_at) = a.week) as done 
from bugs as a 
group by week 

Сообщение об ошибке:

колонка a.week не существует

UPDATE:

следуя предложению первого комментария, я попытался это:

select a.extract(week from created_at) as week, 
    count(*) as received, (select count(*) 
from bugs 
where extract(week from updated_at) = a.week) as done from bugs as a group by week 

Но это не похоже на работу:

ERROR: syntax error at or near "from" 
LINE 1: select a.extract(week from a.created_at) as week, count(*) a... 
+0

Вы не можете ссылаться на псевдоним, как, что вам нужно использовать 'a.extract (неделю с created_at)' вместо –

+0

Это делает но он, похоже, не работает. Я мог бы неправильно понять ... – ndemoreau

+0

Вы не можете использовать 'a.week' во вложенном элементе. –

ответ

3

Насколько я могу вам сказать, не нужно суб-выбора вообще:

select extract(week from created_at) as week, 
     count(*) as received, 
     sum(case when extract(week from updated_at) = extract(week from created_at) then 1 end) as done 
from bugs 
group by week 

Это подсчитывает все ошибки в неделю и подсчитывает те, которые обновляются на той же неделе, что и «сделано».

Обратите внимание, что ваш запрос будет сообщать только правильные значения, если у вас никогда не было более одного года в вашей таблице.

Если у Вас есть больше чем один год в таблице данных необходимо включить в год в сравнении, а также:

select to_char(created_at, 'iyyy-iw') as week, 
     count(*) as received, 
     sum(case when to_char(created_at, 'iyyy-iw') = to_char(updated_at, 'iyyy-iw') then 1 end) as done 
from bugs 
group by week 

Обратите внимание, что я использовал IYYY в IW для удовлетворения определения ISO года и недели вокруг конца года/начала.


Возможно небольшое объяснение о том, почему ваш исходный запрос не работал бы полезно:

«внешний» запрос использует два псевдонима

  • таблица псевдоним для bugs имени a
  • псевдоним столбца для выражения extract(week from created_at) по названию week

только место, где может быть использована колонка псевдоним week находится в пункте group by.

В подвыборном (select count(*) from bugs where extract(week from updated_at) = a.week)) псевдоним a видна, но не псевдоним week (так определяется стандарт SQL).

Чтобы получить подвыбор рабочий (с точки зрения видимости столбца) вам нужно будет ссылаться на полное выражение в колонке «внешней»:

(select count(*) from bugs b where extract(week from b.updated_at) = extract(week from a.created_at)) 

Обратите внимание, что я представил еще одну таблицу псевдонимов b для того, чтобы он ясно указывает, из какого столбца вытекает псевдоним.

Но даже тогда у вас возникнет проблема с группировкой, поскольку вы не можете ссылаться на негруппированный столбец, подобный этому.

1

, которые могли бы работать, а

with origin as (
    select extract(week from created_at) as week, count(*) as received 
    from bugs 
    group by week 
) 
select week, received, 
    (select count(*) from bugs where week = extract(week from updated_at)) 
from origin 

он должен иметь хорошую производительность

+0

Спасибо! Я не знал об этом команде «с происхождением» – ndemoreau

+0

, это не «с началом», а просто «с именем». Я использовал источник как имя для следующего запроса. замените источник любым другим именем, которое вам нравится – devanand

Смежные вопросы