2017-11-09 5 views
1

팬더에서 반복하려는 목록이 있고 목록의 각 항목에 대해 SQL의 여러 구성 요소에 적용됩니다 쿼리Python의 SQL 문에서 루프의 변수를 여러 번 사용하는 방법

다음은 내가 사용하려고 노력한 것입니다.하지만 결과에서 아무 것도 얻지 못하기 때문에 변수가 올바르게 채워지지 않는다고 생각합니다.

파이썬 외부에서 SQL 쿼리를 실행하면 하나의 하드 코드 된 값으로 작동합니다.

무엇이 누락 되었습니까?

import teradata 
import pandas as pd 
import numpy as np 
import datetime 

start_date = "2017-10-28" 
stop_date = "2017-10-30" 
mydates = pd.date_range(start_date, stop_date, format='%Y-%d-%m') 
date_list = [d.strftime('%Y-%m-%d') for d in mydates] 

data = [] 

for x in date_list: 
    for row in session.execute(""" 
    select distinct CAST(? as DATE)as dateId, count(*) 
    FROM tableA 
    where last_date>=?-365 and first_date>=?-360 
    group by 1""", (x, x, x,)): 
     data.append(row) 
+0

SQLAlchemy를 사용하고 있습니까? –

+1

Teradata에서 간단히 별칭을 대신 사용할 수 있습니다 :'where last_date> = dateId-365 and first_date> = dateId-360' – dnoeth

+0

@EricEdLohmar IDE로 PyCharms를 사용하고 있으며 위 패키지를 사용하고있는 패키지로 편집했습니다 – TheIntrepidSpiff

답변

0

당신은 어떤 수치 연산, + - * /에서, 매개 변수 자리, ?을 사용하고, (LIKE 표현으로 즉, 합치 와일드 카드 사업자) 문자열 작업에 대해 동일한 수 없습니다.

따라서, 단순히 con.execute 또는 cursor.executePARAMS 인수에 준비된 문장에 값을 바인딩하기 전에 작업을 실행합니다. 또한 하나의 튜플 내에서 끝나는 쉼표는 하나의 항목 튜플에 대해서만 여러 항목에 필요하지 않습니다.

import datetime as dt 

start_date = dt.datetime.strptime("2017-10-28", '%Y-%m-%d') 
stop_date = dt.datetime.strptime("2017-10-30", '%Y-%m-%d') 

rng = (stop_date - start_date).days 

date_list = [(start_date + dt.timedelta(days=i)).strftime(format='%Y-%m-%d') 
      for i in range(rng+1)]  
last_date_list = [(start_date + dt.timedelta(days=i+365)).strftime(format='%Y-%m-%d') 
        for i in range(rng+1)]  
first_date_list = [(start_date + dt.timedelta(days=i+360)).strftime(format='%Y-%m-%d') 
        for i in range(rng+1)] 

strSQL = """select distinct CAST(? as date format 'YYYY-MM-DD') as dateId, count(*) 
      from tableA 
      where last_date >= cast(? as date format 'YYYY-MM-DD') 
       and first_date >= cast(? as date format 'YYYY-MM-DD') 
      group by 1""" 

for x, l, f in zip(date_list, last_date_list, first_date_list): 
    for row in session.execute(strSQL, (x, l, f)): 
     data.append(row) 
+0

이것은 확실히 작동 할 수 있습니다. 그러나 OP의 데이터 유형을 염두에두고 예제를 확장하거나'datetime'을'date'와' '팬더'가 필요 없다면 '팬더'대신 '팀데타'를 사용하십시오. –

+0

좋은 지적! OP가 쿼리 및 매개 변수에 필요한 목록을 통해'zip() '할 수있는 위치에 맞게 편집됩니다. – Parfait