Подсчет PostgreSQL с условиями на основе столбца - PullRequest
0 голосов
/ 12 июня 2018

У меня есть таблица с именем admin_descriptions, в которой есть следующие столбцы:

description_id, value, admin_id, valid_at

И таблица adminsкоторый имеет следующие столбцы:

state

Я хочу запрос, который получил description_id, он дает мне количество активных администраторов, которые используют это описание.Описание для администратора считается используемым , пока в таблице admin_descriptions есть строка, содержащая description_id, NOT NULL value и valid_at, более поздняя, ​​чем любая другая запись.у которого есть NULL value для этого description_id.

Итак, пример данных:

Row 1:
description_id: 1
value: 'foo'
admin_id: 2
valid_at: '2010-01-10'

Row 2:
description_id: 1
value: NULL
admin_id: 2
valid_at: '2012-01-10'

Row 2:
description_id: 1
value: 'some value'
admin_id: 4
valid_at: '2014-01-10'

Количество при запросе description_id = 1 будет равно 1. Это будет просто считать строку 3Поскольку даже если есть первая строка, в которой значение NOT NULL, есть строка 2, для которой valid_at является более поздним для того же admin_id, а value равно NULL.

Мне удалось получить количествобез учета valid_at через:

SELECT COUNT(DISTINCT(ad.id)) AS COUNT
FROM admin_descriptions ad
JOIN admins ON admins.id = ad.admin_id
WHERE ad.description_id = 1
AND admins.state = 'active'

Как я могу изменить этот запрос, чтобы учесть valid_at для каждой комбинации admin_id / description_id?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Я бы использовал distinct on, чтобы получить самое последнее описание администратора, а затем выполнить агрегирование оттуда:

select count(*) as num_valid_admins
from (select distinct on (ad.admin_id) ad.*
     from admin_descriptions ad
     where ad.description_id = XXX
     order by ad.admin_id, ad.valid_at desc
    ) ad
where ad.value is not null;
0 голосов
/ 12 июня 2018

Я думаю, что-то вроде этого должно позволить вам проверить valid_at для каждого сгруппированного идентификатора.

SELECT
  COUNT(ad.id)
FROM admin_description ad
  INNER JOIN admins ON admins.id = ad.admin_id
    AND admins.state = 'active'
WHERE
  1 = 1
  -- AND valid_at -- However you want to handle valid_at
GROUP BY ad.id;

Предполагая, что каждая комбинация admin_id / description_id всегда уникальна.

Если нет,возможно, вы можете сначала попробовать сгруппировать id, admin_id, description_id, чтобы отфильтровать дубликаты.

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