Посчитать maxdate с условием - PullRequest
0 голосов
/ 02 июля 2019

(извините, если я не правильно отформатировал вопрос, это мой первый пост).

У меня есть следующие примеры данных:

a.label |   b.recipient_id| b.action|b.creation_date  
Books | Recipient1 |    0 | 01/04/2018  
Books | Recipient1 |    1 | 02/04/2018  
Books | Recipient1 |    0 | 03/04/2018  
Books | Recipient1 |    1 | 04/04/2018  
Books | Recipient2 |    1 | 05/04/2018  
Books | Recipient2 |    0 | 06/04/2018  
Books | Recipient2 |    0 | 07/04/2018  
Books | Recipient2 |    1 | 08/04/2018  
Books | Recipient3 |    1 | 13/04/2018  
Books | Recipient3 |    0 | 14/04/2018  
Books | Recipient3 |    1 | 15/04/2018  
Books | Recipient3 |    0 | 16/04/2018  

Я хотел бы посчитать получателяmax (creation_date) action = 1

Если для max (creation_date) action равно 0, я вообще не хочу считать этого получателя.

Так что в приведенном выше примере данных я хотел бысчитать Recipient1 и Recipient2, но не Recipient3.

Я пробовал разные варианты, но пока ничего не получалось

SELECT count(b.recipient_id)
FROM Services a, Subscriptions b,
(SELECT recipient_id,MAX(creation_date)
FROM Subscriptions
GROUP BY recipient_id) c
WHERE a.SERVICE_ID = b.SERVICE_ID
AND b.recipient_id = c.recipient_id
AND b."ACTION" = '1'
AND a.LABEL = 'Books'

Заранее спасибо

1 Ответ

0 голосов
/ 02 июля 2019

Вот один метод, использующий два уровня агрегации:

select count(*)
from (select su.recipient_id
      from services se join
           subscriptions su
           on se.service_id = su.service_id
      where se.label = 'BOOKS'
      group by su.recipient_id
      having max(su.creation_date) = max(case when su.action = 1 then su.creation_date)
     ) ss;

Предложение having проверяет, что окончательный статус 1.

Примечания:

  • Никогда не используйте запятые в предложении FROM.
  • Всегда используйте правильный, явный, стандартный JOIN синтаксис.
  • Используйте значимые псевдонимы таблиц, такие как сокращения имени таблицы, а не произвольные буквы.
  • Используйте одинарные кавычки для разделения строк. Двойные кавычки могут использоваться для экранирования идентификаторов, если это необходимо.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...