Тестовая задача по SQL

Столкнулся с задачей на тестовом задании, к которой не получилось подступиться:

"В онлайн торгах участвуют несколько товаров, для них каждый день по закрытию торгов записывается последняя цена. Для каждого из товаров необходимо найти количество дней, за которое цена на него устоялась (устоявшейся ценой считаем ту, после которой от дня к дню цена менялась не более чем на 3%). В качестве результата необходимо получить таблицу [product_name, days_num]. Если такой даты нет, необходимо вывести -1."

Что попробовал? Создать тестовую табличку и "поизалаяться" над ней:

import sqlite3

# Для создание тестовой таблички
conn = sqlite3.connect(':memory:')  # Используем временную базу данных в памяти

# Курсор для выполнения запросов
cur = conn.cursor()

# Сама тестовая таблица
cur.execute('''CREATE TABLE prices (
                product_name TEXT,
                date DATE,
                price DECIMAL(10, 2)
            )''')

# Наполненение
data = [
    ("ProductA", "2024-05-01", 10.50),
    ("ProductA", "2024-05-02", 10.60),
    ("ProductA", "2024-05-03", 10.55),
    ("ProductA", "2024-05-04", 10.58),
    ("ProductA", "2024-05-05", 12),
    ("ProductB", "2024-05-01", 20.00),
    ("ProductB", "2024-05-02", 19.2),
    ("ProductB", "2024-05-03", 19.00),
    ("ProductB", "2024-05-04", 19.90),
    ("ProductB", "2024-05-05", 19.85),
    ("ProductB", "2024-05-06", 19.80)
]

cur.executemany('INSERT INTO prices VALUES (?, ?, ?)', data)

# Временная таблица для предыдущих цен
cur.execute('''CREATE TEMP TABLE prev_prices AS
               SELECT 
                   product_name,
                   date,
                   price,
                   LAG(price, 1, NULL) OVER (PARTITION BY product_name ORDER BY date) AS prev_price
               FROM 
                   prices''')

# Добавления столбца с процентным изменением
cur.execute('''ALTER TABLE prices
               ADD COLUMN price_change_percent DECIMAL(10, 2)''')

# Добавление значений
cur.execute('''
    UPDATE prices
    SET price_change_percent = ROUND((prices.price - prev_prices.prev_price) / prev_prices.prev_price * 100, 2)
    FROM prev_prices
    WHERE prices.product_name = prev_prices.product_name
    AND prices.date = prev_prices.date;
''')

# Тут хочу посчитать количество дней с конца, для которых выполняется условие
cur.execute('''
    
''')

results = cur.fetchall()
print(results)

# Закрыть соединение
conn.close()

Предполагаю, что осталось 2 этапа - посчитать количество дней с конца и вычислить разность общего количества дней с тем, что получилось при подсчете. Затем вывести результат - либо значение разности, либо, если счетчик был равен 0, -1, как требует задание.

Но как их реализовать - не понимаю. Возможно, что и в предыдущей логике и реализации были изъяны, но вроде бы негде.


Ответы (0 шт):