Нахождение даты min () для одного столбца и последующее использование этого для объединения с другими таблицами, у которых дата меньше, чем эта дата - PullRequest
0 голосов
/ 08 ноября 2019

Короче, у меня есть две таблицы:

(1) pharmacy_claims (столбцы: user_id, date_service, claim_id, record_id, prescription)

(2) medical_claims (столбцы: user_id, date_service, provider, npi, cost)

Я хочу найти user_id в (1)с определенным значением prescription, найдите их самые ранние date_service (например, min(date_service)), а затем используйте эти user_id с их самой ранней датой службы в качестве когорты, чтобы извлечь все связанные с ними данные из (2),По сути, я хочу найти все их medical_claims данных до того, как в первый раз им прописали данный рецепт в pharmacy_claims.

pharmacy_claims выглядит примерно так:

user_id | prescription | date_service
1           a             2018-05-01
1           a             2018-02-11
1           a             2019-10-11
1           b             2018-07-12
2           a             2019-01-02
2           a             2019-03-10
2           c             2018-04-11
3           c             2019-05-26

Так, например, если бы меня интересовал рецепт = 'a', я бы хотел, чтобы только user_id 1 и 2 возвращались с датами2018-02-11 и 2019-01-02 соответственно. Тогда я бы хотел получить user_id 1 и 2 из medical_claims и получить все их данные до этих соответствующих дат.

Я попытался сделать это, построив временную таблицу в таблице pharmacy_claims, чтобы запросить user_id, у которых есть данное лекарство, и затем оставил присоединиться к таблице обратно. создать когорту из user_id с date_service

Вот что я сделал:

(1) Получил все соответствующие данные из основной таблицы требований аптек:

CREATE TABLE user.temp_pharmacy_claims AS
SELECT user_id, claim_id, record_id, date_service
FROM dw.pharmacyclaims 
WHERE date_service between '2018-01-01' and '2019-08-31'

В результате получается ~ 50 000 user_id

(2) Создан стол с user_id sa min(date_service):

CREATE TABLE user.temp_pharmacy_claims_index AS
SELECT distinct user_id, min(date_service) AS Min_Date
FROM user.temp_pharmacy_claims
GROUP BY 1

(3) Создан финальный стол (чтобы получить желаемую когорту):

CREATE TABLE user.temp_pharmacy_claims_final_index AS
SELECT a.userid
FROM user.temp_pharmacy_claims  a
LEFT JOIN user.temp_pharmacy_claims_index b
ON a.user = b.user
WHERE  a.date_service < Min_Date

Однако, это дает мне 0 результатов, когда должно быть несколько тысяч. Правильно ли настроено? Вероятно, это не самый эффективный подход, но для меня это звучит неплохо, поэтому не уверен, что происходит.

1 Ответ

1 голос
/ 08 ноября 2019

Я думаю, вы просто хотите коррелированный подзапрос:

select mc.*
from medical_claims mc
where mc.date_service < (select min(pc.date)
                         from pharmacy_claims pc
                         where pc.user_id = mc.user_id and 
                               pc.prescription = ?
                        );
...