2017-02-17 9 views
0
select id, wk0_count 
from teams 
left join 
    (select team_id, count(team_id) as wk0_count 
    from (
     select created_at, team_id, trunc(EXTRACT(EPOCH FROM age(CURRENT_TIMESTAMP,created_at))/604800) as wk_offset 
     from loan_files 
     where loan_type <> 2 
     order by created_at DESC) as t1 
    where wk_offset = 0 
    group by team_id) as t_wk0 
on teams.id = t_wk0.team_id 

Я создал запрос выше, который показывает мне, сколько кредитов каждая команда сделала за данную неделю. Неделя 0 - последние семь дней.Postgresql кол-во за последние недели

В идеале я хочу таблицу, которая показывает, сколько кредитов каждая команда сделала за последние 8 недель, сгруппированных по неделям. Вывод будет выглядеть следующим образом:

enter image description here

Все идеи на лучший способ сделать это?

+0

Mysql или postgresql? – GurV

+0

@GurV Похож на Postgres для меня –

ответ

0
select 
    t.id, 
    count(week = 0 or null) as wk0, 
    count(week = 1 or null) as wk1, 
    count(week = 2 or null) as wk2, 
    count(week = 3 or null) as wk3 
from 
    teams t 
    left join 
    loan_files lf on lf.team_id = t.id and loan_type <> 2 
    cross join lateral 
    (select (current_date - created_at::date)/7 as week) w 
group by 1 

В 9.4+ версии используют aggregate filter syntax:

count(*) filter (where week = 0) as wk0, 

lateral от 9.3. В предыдущей версии переместите выражение week в состояние фильтра.

+0

Спасибо - я буду копать больше в агрегатный фильтр synatx. Возможно, именно по этой причине я получаю эту ошибку: ERROR: оператора не существует: date/integer LINE 12: (выберите current_date - lf.created_at :: date/7 as week) ... ^ СОВЕТ: Никаких совпадений оператора имя и тип аргумента. Возможно, вам придется добавлять явные типы. –

+0

@LancePoole Исправлено: –

+0

-Выбрать вопрос о запросе. В таблице команд есть teams.id, которые не отображаются в этом запросе. Почему это? Я пробовал левое соединение, но это не работает. В идеале, результат будет содержать список teams.id от команд. –

0

Как насчет следующего запроса?

SELECT team_id AS id, count(team_id) AS wk0_count 
FROM teams LEFT JOIN loan_files ON teams.id = team_id 
WHERE loan_type <> 2 
    AND trunc(EXTRACT(epoch FROM age(CURRENT_TIMESTAMP, created_at))/604800) = 0 
GROUP BY team_id 

Заметные изменения:

  • ORDER BY в предложении подзапроса было бессмысленно;
  • created_at в самом внутреннем подзапросе никогда не использовался;
  • Тест wk_offset перемещается по предложению WHERE и не выполняется в два разных шага;
  • внешний подзапрос не был необходим.
+0

Fabian - так бы я делал этот запрос несколько раз за каждую неделю, я хочу в выходе, а затем присоединяюсь к ним? –

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