Python SQL Livecode

SQL-задачи

-- Таблица orders:
user_id    item_id     date          order_id
==============================================
1          1           2021-01-01    1
1          2           2021-01-01    1
1          3           2021-02-15    101
2          1           2019-12-31    2
2          2           2020-07-01    201
3          4           2022-12-10    3
4          1           2022-12-11    4
               ...
-- Поля:
-- user_id - идентификатор пользователя
-- item_id - идентификатор товара
-- date - дата покупки
-- order_id - идентификатор заказа
 
-- ## ЗАДАЧА 1:
-- Посчитать в одном запросе:
-- - количество купленных товаров по дням
-- - размер аудитории (кол-во уникальных пользователей) по дням
-- - полученную таблицу отсортировать по дате
 
SELECT 
date,
COUNT(item_id),
COUNT(distinct user_id)
FROM orders
GROUP BY date
ORDER BY date
 
 
 
-- ## ЗАДАЧА 2:
-- Вывести список пользователей, купивших item_id 1 и 3 (купил и товар 1, и товар 3), но не купивших товар 2
 
SELECT user_id
FROM
(SELECT DICTINCT user_id
FROM orders
WHERE item_id = 1) 01
INNER JOIN
(SELECT DICTINCT user_id
FROM orders
WHERE item_id = 3) o2
using(user_id)
INNER JOIN
(SELECT DICTINCT user_id
FROM orders
WHERE NOT item_id = 2) o3
using(user_id)
 
 
 
-- ## ЗАДАЧА 3: (не дорешали)
-- Посчитать среднее количество дней между первым и вторым заказом у пользователей
 
 
SELECT 
user_id,
MIN(date) as first_order
FROM orders
SELECT 
IF
CASE order_number = 1 THEN date, 
end
FROM (SELECT
user_id,
ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY date) as order_number,
date
FROM orders) o1
GROUP BY user_id
 
 
 
 
# Является ли данная строка палиндромом. 
 
# Пример:
s =  'A man, a plan, a canal, Panama!'  #-> True
 
def isPolindrom(s: str) -> bool:
    s = s.lower()
    new_s = ""
    for c in s:
        if c.isalpha():
            new_s += c
 
    return new_s == new_s[::-1]
 
 
 
# Напишите функцию на Python, 
# которая принимает на вход строку и возвращает максимальную длину 
# последовательности из двух уникальных символов
 
#ababcababa
def func(s):
    if len(s) < 3:
        return len(s)
    
 
    l = 0
    r = 1
    
    alph = set([s[l], s[r]])
    max_len = -1
    while r < len(s):
        while len(alph) < 3 and r < len(s):
            r += 1
            alph.add(s[r])
        cur_len = r - l
        if cur_len > max_len:
            max_len = cur_len
        l = r
        r += 1
 
    return max_len
 
   
 
# Представь, что мы работаем в компании которая делает рекламный движок.
# Нужно написать функцию, которая на вход принимает баннеры и веса, а на выходе отдает случайный
# баннер с вероятностью пропорциональной весу.
 
banners = ["a", "b", "c"]
weights = [1, 2, 3]
 
['a', 'b', 'b', 'c', 'c', 'c']
 
обсудили решение, не стали кодить (разбить интервал от 0 до 1 на n отсечек, n - сумма весов, потом математически находить название баннера по случайному числу от 0 до 1)