Использование оператора CASE WHEN и подзапроса IN (SELECT ... FROM) - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь создать временную таблицу и создать другую логику CASE WHEN для двух разных лекарств. Короче говоря, у меня есть два столбца, представляющих интерес для этих утверждений CASE WHEN;procedure_code и ndc_code. Мне нужно только 3 кода процедуры, но есть около 20 различных кодов ndc. Я создал временную таблицу temp.ndcdrug1 с этими кодами ndc для лекарства1 и temp.ndcdrug2 для кодов ndc для лекарства2 вместо того, чтобы перечислять каждый код ndc по отдельности. Мой запрос выглядит следующим образом:

CREATE TABLE temp.flags AS
SELECT DISTINCT a.userid,
                    CASE WHEN (procedure_code = 'J7170' OR ndc_code in (select ndc_code from temp.ndcdrug1))  THEN 'Y' ELSE 'N' END AS Drug1,
                    CASE WHEN (procedure_code = 'J7205' OR procedure_code = 'C9136' OR ndc_code in (select ndc_code from temp.ndcdrug2)) THEN 'Y' ELSE 'N' END AS Drug2,
                    CASE WHEN (procedure_code = 'J7170' AND procedure_code = 'J7205') THEN 'Y' ELSE 'N' END AS Both
FROM table1 a
LEFT JOIN table2 b
ON a.userid = b.userid
WHERE...
AND...

Когда я его запускаю, он возвращает: org.apache.spark.sql.AnalysisException: подзапросы предиката IN / EXISTS могут использоваться только в фильтре. Я мог бы перечислить эти ndc_code значения по отдельности, но их очень много, поэтому хотелось найти более эффективный способ решения этой проблемы. Можно ли использовать подобный запрос для выбора при записи CASE WHEN?

1 Ответ

0 голосов
/ 02 октября 2019

Запрос.

CREATE TABLE temp.flags AS
SELECT DISTINCT a.userid,
          CASE WHEN (
            procedure_code = 'J7170' OR 
            (select min('1') from temp.ndcdrug1 m where m.ndc_code = a.ndc_code) = '1'
          )  THEN 'Y' ELSE 'N' END AS Drug1,
          CASE WHEN (
            procedure_code = 'J7205' OR 
            procedure_code = 'C9136' OR 
            (select min('1') from temp.ndcdrug2 m where m.ndc_code = a.ndc_code) = '1'
          ) THEN 'Y' ELSE 'N' END AS Drug2,
          CASE WHEN (procedure_code = 'J7170' AND procedure_code = 'J7205') 
          THEN 'Y' ELSE 'N' END AS Both
FROM table1 a
LEFT JOIN table2 b
ON a.userid = b.userid
WHERE...
AND...
...