#python #sqlalchemy #teradata
#python #sqlalchemy #teradata
Вопрос:
Я пытаюсь переписать некоторый необработанный Teradata SQL в SQLAlchemy Core и столкнулся с проблемой с QUALIFY
ключевым словом. Например, учитывая приведенный ниже код:
SELECT itemid, sumprice, RANK() OVER (ORDER BY sumprice DESC)
FROM (SELECT a1.itemid, SUM(a1.sale) AS sumprice
FROM sales AS a1
GROUP BY a1.itemid) as t1
QUALIFY RANK() OVER (ORDER BY sumprice DESC) <= 100;
Я могу переписать большую часть этого следующим образом:
from sqlalchemy import create_engine, MetaData, Table
from sqlalchemy.sql import select, func
engine = create_engine('teradatasql://user:password@server/logmech=LDAPamp;encrpytdata=true')
metadata = MetaData(bind=engine)
a1 = Table('sales', metadata, autoload=True, autoload_with=engine).alias('a1')
t1 = select([a1.c.itemid, func.sum(a1.c.sale).label('sumprice')]).group_by(a1.c.itemid).subquery()
sql = select([t1.c.itemid, t1.c.sumprice, func.rank().over(order_by=t1.c.sumprice.desc())])
sql = sql.select_from(t1)
Если бы я напечатал этот код stdout
, например, так:
print(sql.compile(engine, compile_kwargs={'literal_binds': True}))
это дало бы мне точный запрос, как указано выше, за исключением последней строки. Как мне вставить эту QUALIFY
строку туда?
Комментарии:
1. Я не думаю, что sqlalchemy будет использовать синтаксис (специфичный для Teradata)
QUALIFY
. Но вы могли бы сделать ваш существующий SQL подзапросом (скажем, t2), а затем применить предложение WHERE во внешнем запросе.2. Привет @Fred. большое вам спасибо за ваши мысли. Я уже пробовал это делать. Teradata НЕ нравится
QUALIFY
предложение внутриWHERE
. В конце концов, это действительно должно остаться как что-то свое. Пока что единственный способ, которым я наткнулся на ответ, — это преобразовать приведенноеsql
выше в строку и использоватьtext
функцию SQLAlchemy для созданияQUALITY
фрагмента. Затем я должен соединить две строки. Это очень неприятно, потому что многие люди используют его внутриQUALIFY
, что делает мою работу намного сложнее, чем нужно. Если бы я мог просто каким-то образом добавить строку в конец утверждения, тогда у меня все получилось.3. Не используйте QUALIFY вообще. В этом случае сгенерируйте
SELECT itemid, sumprice, theRank FROM (SELECT itemid, sumprice, RANK() OVER (ORDER BY sumprice DESC) as theRank FROM (SELECT a1.itemid, SUM(a1.sale) AS sumprice FROM sales AS a1 GROUP BY a1.itemid) as t1) as t2 WHERE theRank <= 100;