Postgres: сохранить общий запрос как атрибут таблицы? - PullRequest
0 голосов
/ 06 сентября 2018

Я использую Postgres 9.6. У меня есть таблица пользователей:

 id                            | integer                     |           | not null | nextval('user_id_seq'::regclass)
 name                          | character varying           |           | not null | 

И у меня есть action таблица:

 actioned_by      | integer                     |           |          | 
 category         | character varying           |           | not null | 
 t_actioned       | timestamp without time zone |           | not null |     

И у меня есть запрос, который указывает, сколько дней за последние 30 дней пользователь был активен:

 SELECT d.actioned_by, COUNT(*) AS cnt FROM 
  (SELECT date_trunc('day', t_actioned) AS day, actioned_by 
   FROM history 
   GROUP BY day, actioned_by) d 
 GROUP BY actioned_by
 ORDER BY cnt DESC;

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

Было бы очень полезно, если бы я мог делать такие вещи, как «получить всех французских пользователей, которые были активны более 5 дней в месяце», без необходимости каждый раз вводить все вышеперечисленное.

Возможно, мне нужен вид?

1 Ответ

0 голосов
/ 06 сентября 2018

Рекомендуемый способ - это создание представления.

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

-- Virtual column is a function that has a table type in its signature
CREATE FUNCTION last_activity("user") RETURNS text AS $$
    SELECT d.actioned_by, COUNT(*) AS cnt FROM 
      (SELECT date_trunc('day', t_actioned) AS day, actioned_by 
       FROM history
        --Filter
        WHERE actioned_by = $1.id
       GROUP BY day, actioned_by) d 
     GROUP BY actioned_by
     ORDER BY cnt DESC;    
$$ LANGUAGE SQL;

--In order to use virtual columns you must qualify it with table name/alias
SELECT u.last_activity, * FROM "user" u;

Подробнее здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...