Как добавить ключевое слово Teradata QUALIFY в конец инструкции ядра SQLAlchemy?

#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;