Как найти группу строк исключительно между двумя датами в MySQL?

0

Мне нужно найти группу результатов с общим ключом, который был отправлен в API моего локального хранилища данных не ранее, чем за последние 90 дней, но не позднее, чем за последние 7 дней.

Это будет действительная группа, для которой мне нужно записать 1234:

account_id,company_id,posted_date
1234,A,2018-02-28
1234,B,2018-03-13
1234,C.2018-04-23
1234,D,2018-05-15

Это будет недопустимая группа. Если одна дате выходит за пределы верхней или нижней полосы запроса, идентификатор учетной записи должен быть исключен из окончательных результатов:

account_id,company_id,posted_date
5678,Z,2018-02-01
5678,Y,2018-03-13
5678,X.2018-04-23
5678,W,2018-05-21

Это первый черновик запроса с использованием подзапросов:

SELECT DISTINCT account_id, company_id FROM local_data_store.result_api
WHERE account_id NOT IN (
    SELECT account_id FROM local_data_store.result_api
    GROUP BY account_id
    HAVING posted_date > DATE_SUB(NOW(), INTERVAL 7 DAY)
)
AND account_did IN (
    SELECT account_did FROM local_data_store.result_api
    GROUP BY account_did
    HAVING posted_date > DATE_SUB(NOW(), INTERVAL 90 DAY)
)
GROUP BY account_id, company_id
LIMIT 100000;

Это запрос, над которым я сейчас работаю без подзапросов (я пытался подключиться, но они действительно не работали):

SELECT DISTINCT account_id, company_id, 
COUNT(ra1.posted_date > DATE_SUB(NOW(), INTERVAL 90 DAY)) AS day90, 
COUNT(ra1.posted_date > DATE_SUB(NOW(), INTERVAL 7 DAY)) as day7
FROM local_data_store.result_api ra1
GROUP BY posted_date, account_id;

Но он работает так долго, что соединение с базой данных истекает. Это только в таблице базы данных из 375 000 строк.

  • 0
    См. Meta.stackoverflow.com/questions/333952/…
  • 0
    @Strawberry, ну, я выполнил # 3, так что, думаю, я попробую поработать над № 1 и № 2.
Теги:

1 ответ

0
Лучший ответ

Вот решение, которое я придумал. Надеюсь, это поможет кому-то другому.

SELECT DISTINCT account_did, cb_company_id, COUNT(did) as '# of jobs'
FROM cb_local_data_store.job_search_result_api 
WHERE account_did NOT IN (
SELECT account_did FROM cb_local_data_store.job_search_result_api
WHERE posted_date < DATE_SUB(NOW(), INTERVAL 60 DAY)
OR posted_date > DATE_SUB(NOW(), INTERVAL 4 DAY) )
GROUP BY account_did, cb_company_id

Ещё вопросы

Сообщество Overcoder
Наверх
Меню