Подсчитать количество эпизодов с хешем - PullRequest
1 голос
/ 22 марта 2019

Мне нужна помощь с 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, мне сейчас не нужны целые строки.(для проверки резюме и т. д. понадобится последний).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...