Несколько идентификаторов в подзапросе для расчета количества - PullRequest
0 голосов
/ 12 июня 2018

У меня есть этот запрос:

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;

, который успешно дал description_id, он дает мне количество администраторов, которые используют это описание.Описание для администратора считается использованным до тех пор, пока в таблице admin_descriptions имеется строка с description_id, значением NOT NULL и valid_at, более свежая, чем любая другая запись с NULL.значение для этого 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, а ее значение равно NULL.

Теперь я пытаюсь изменитьзапрос, чтобы я мог запросить его для нескольких description_ids, и я не могу понять, как изменить запрос.Я хотел бы получить набор результатов, который выглядит следующим образом: description_id, count.

Я пытался изменить внутренний запрос следующим образом:

select count(*) as num_valid_admins
from (select distinct on (ad.admin_id) ad.*
     from admin_descriptions ad
     where ad.description_id IN (x,y,z)
     order by ad.admin_id, ad.valid_at desc
    ) ad
where ad.value is not null
GROUP BY ad.description_id

Но я не возвращаю счетdescription_id.

1 Ответ

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

Вам необходимо добавить идентификатор описания к order by и distinct on:

select ad.description_id, count(*) as num_valid_admins
from (select distinct on (ad.description_id, ad.admin_id) ad.*
     from admin_descriptions ad
     where ad.description_id IN (x, y, z)
     order by ad.description_id, ad.admin_id, ad.valid_at desc
    ) ad
where ad.value is not null
group by ad.description_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...