Sqllite: Как оптимизировать следующий запрос? - PullRequest
0 голосов
/ 01 февраля 2020

Я хочу посчитать для каждого товара в моей таблице количество разных усыновлений, которые происходили каждую неделю, и под разными усыновлениями я подразумеваю количество усыновителей, которые приняли товар впервые. Я написал этот подробный код, и я уверен, что его можно переписать лучше. Спасибо.

    conn = sqlite3.connect("prova.db")
    conn.execute("""CREATE TABLE IF NOT EXISTS adoptions
                   (good TEXT  NOT NULL,
                   adopter TEXT NOT NULL,
                   slot      INTEGER NOT NULL,
                   quantity  INTEGER
                   );""")


    conn = sqlite3.connect("prova.db")
    conn.execute("""INSERT into adoptions (good, adopter, slot, quantity) VALUES ('%s', '%s', %d, %d)""" %
                 (0, 4, 0, 9))
    conn.execute("""INSERT into adoptions (good, adopter, slot, quantity) VALUES ('%s', '%s', %d, %d)""" %
                 (0, 5, 0, 10))
    conn.execute("""INSERT into adoptions (good, adopter, slot, quantity) VALUES ('%s', '%s', %d, %d)""" %
                 (0, 4, 1, 2))
    conn.commit()
    conn.execute('CREATE INDEX IF NOT EXISTS good_idx on adoptions(good)')
    conn.execute('CREATE INDEX IF NOT EXISTS adopter_idx on adoptions(adopter)')
    conn.execute('CREATE INDEX IF NOT EXISTS slot_idx on adoptions(slot)')
    conn.close()

    conn = sqlite3.connect("prova.db")
    cur = conn.cursor()
    cur.execute("""SELECT distinct good from adoptions""")
    goods = cur.fetchall()

    training_set_start_edge = 0
    training_set_end_edge = 1

    for good in goods:
        good = good[0]

        conn = sqlite3.connect("prova.db")
        cur = conn.cursor()
        cur.execute("""SELECT distinct adopter from adoptions 
                           where (good='%s' AND slot >=  '%d' AND slot <= '%d') 
                          """ % (good, training_set_start_edge, training_set_end_edge))
        adopters = cur.fetchall()

        print(adopters)


        for ad in adopters:
            ad = ad[0]

            conn = sqlite3.connect("prova.db")
            cur = conn.cursor()
            cur.execute("""SELECT min(slot) from adoptions 
                                 where (good='%s' AND adopter = '%s' AND slot >=  '%d' AND slot <= '%d') 
                                """ % (good, ad, training_set_start_edge, training_set_end_edge))
            ad_min_slot = cur.fetchall()
            ad_min_slot = ad_min_slot[0]

1 Ответ

0 голосов
/ 01 февраля 2020

Ваш код просто находит мин (слот) для каждой пары (хорошо, усыновитель).

conn = sqlite3.connect("prova.db")
conn.execute("""CREATE TABLE IF NOT EXISTS adoptions
               (good TEXT  NOT NULL,
               adopter TEXT NOT NULL,
               slot      INTEGER NOT NULL,
               quantity  INTEGER
               );""")

conn.execute("""INSERT into adoptions (good, adopter, slot, quantity) VALUES ('%s', '%s', %d, %d)""" %
             (0, 4, 0, 9))
conn.execute("""INSERT into adoptions (good, adopter, slot, quantity) VALUES ('%s', '%s', %d, %d)""" %
             (0, 5, 0, 10))
conn.execute("""INSERT into adoptions (good, adopter, slot, quantity) VALUES ('%s', '%s', %d, %d)""" %
             (0, 4, 1, 2))
conn.commit()
conn.execute('CREATE INDEX IF NOT EXISTS good_idx on adoptions(good)')
conn.execute('CREATE INDEX IF NOT EXISTS adopter_idx on adoptions(adopter)')
conn.execute('CREATE INDEX IF NOT EXISTS slot_idx on adoptions(slot)')

cur = conn.cursor()

training_set_start_edge = 0
training_set_end_edge = 1

cur.execute("""
    SELECT good, adopter, min(slot) from adoptions
    where (slot >=  '%d' AND slot <= '%d')""" % (training_set_start_edge, training_set_end_edge))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...