Мне нужна помощь с SQL-запросом, я использую SQLAlchemy, но я даже не понимаю, как я могу выразить запрос в необработанном SQL-запросе.
Я разбиваю все кадры всех видео всезон и добавление их в БД.Моя цель состоит в том, чтобы найти вступительные видеофильмы, проверяющие те же кадры восстановления в видео.
Моя таблица выглядит следующим образом:
|id|tvdbid|hash |season|episode|offset
---+------+-----+------+-------+------
|1 |1337 |a1a1a|1 |1 |42
---+------+-----+------+-------+-------
|2 |1337 |a1a1a|1 |1 |68
---+------+-----+------+-------+-------
|3 |1337 |a1a1b|1 |2 |92
---+------+-----+------+-------+-------
|4 |1337 |a1a1a|1 |2 |116
---+------+-----+------+-------+-------
|5 |1337 |a1a1a|1 |3 |42
---+------+-----+------+-------+-------
|6 |1337 |a1a1a|1 |3 |42
Результат, который я ищу, представляет собой список строк, в которыххеш совпадает с n количеством эпизодов (он может совпадать только с эпизодом в то время) и имеет одинаковое значение tvdbid и номер сезона.
В данный момент я делаю:
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Hashes(Base):
__tablename__ = 'hashes'
id = sa.Column(sa.Integer, primary_key=True)
season = sa.Column(sa.Integer)
episode = sa.Column(sa.Integer)
tvdbid = sa.Column(sa.Text(length=100))
hash = sa.Column(sa.Text(length=16))
offset = sa.Column(sa.Integer)
h = Hashes.__table__
async def some_web_request(request):
# I need to use raw sql or core as the db library requires it.
# my cli tool uses a sync method to insert the rows in the db.
query = h.select().where(sa.and_(h.c.tvdbid ==
request.path_params['tvdbid'],
h.c.season == request.path_params['season'])).group_by('hash', 'episode')
result = await DB.fetch_all(query)
return result
Кажется, это работает просто отлично, но это не совсем то, что я хочу, поэтому мне нужно очиститься с помощью python, и это не будет жизнеспособным в долгосрочной перспективе.Таблица будет иметь от 5 до 500 миллионов строк.
Моя текущая "работа вокруг":
from collections import defaultdict
def clean_up(result):
d = defaultdict(set)
for row in result:
d[row.hash].add(row.episode)
final_result = []
for k, v in d.items():
if (l) > 4: # 4 is the number of episodes.
final_result.append(k)
return final_result
Желаемый результат должен быть:
|id|tvdbid|hash |season|episode|offset
---+------+-----+------+-------+------
|1 |1337 |a1a1a|1 |1 |42
так как хеш должен присутствовать как минимум в 50% эпизодов.или это может быть просто a1a1a, мне сейчас не нужны целые строки.(для проверки резюме и т. д. понадобится последний).