Oui, je suis tout à fait convaincu que votre problème résulte de la tentative de définition des noms de colonnes dans votre requête via la liaison de paramètres (and %(target)s in ('ACT')
) comme mentionné dans les commentaires.
Il en résulte que votre requête limite le jeu de résultats aux enregistrements où 'status' in ('ACT')
(c'est-à-dire que la chaîne 'status' est-elle un élément d'une liste contenant uniquement la chaîne 'ACT' ?). Ceci est, bien sûr, faux, donc aucun enregistrement n'est sélectionné et vous obtenez un résultat vide.
Cela devrait fonctionner comme prévu :
import psycopg2.sql
col_name = 'status'
table_name = 'public.churn_data'
query_params = {'date_from':'201712',
'date_to':'201805',
'drform_target':'NPA'
}
sql_data_sample = """select *
from {0}
where dt = %(date_to)s
and {1} in (%(drform_target)s)
----------------------------------------------------
union all
----------------------------------------------------
(select *
from {0}
where dt = %(date_from)s
and {1} in ('ACT')
order by random() limit 50000);"""
sql_data_sample = sql.SQL(sql_data_sample).format(sql.Identifier(table_name),
sql.Identifier(col_name))
df_data_sample = pd.read_sql(sql_data_sample,con = cnxn,params = query_params)