Задать вопрос
Ответы пользователя по тегу SQL
  • Как в SQL посчитать количество пользователей записей, дата которых хотя бы раз была в каждую неделю?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Можешь взять за основу этот шаблон. И дописать его.

    with temp as (
    select 
      user,
      log_time,
      LAG(log_time) OVER (PARTITION BY user ORDER BY log_time) as prev_log_time
    from logins)
    select user, date_diff(log_time , prev_log_time) as days_diff from temp


    В задании неясно что делать с пользователями
    которые за всю историю заходили только один раз. Это маржинальный кейс.

    И напиши какие ожидается получить отчеты в ответ на твою табличку.
    Ответ написан
    Комментировать
  • Как гарантировать монотонное увеличение значения поля при параллельных транзакциях с максимальным быстродействием?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Параллелизм и последовательность - это две противоречивые постановки. Тебе стоит
    пересмотреть подход к разработке. Подумай насколько важен для тебя LastEventNumber
    как объект наблюдения человеком. Если он меняется чаще чем 10 раз в секунду то
    вряд-ли он имеет смысл для публикации.

    В паралелльных системах для массовой загрузки например объекты продюсеры захватывают
    диапазоны номеров. Диапазо берется из объекта SEQUENCE. Умножатеся допутим на 10000.
    И получается что перый продюсер захватил номера с 1 до 10000. Второй - захватит с 10001
    до 20000 и так далее.

    Да у тебя не будет строгой последовательности но вопросы коллизий ключкей и performance
    будут решены сразу и не будет issues в будущем.
    Ответ написан
    Комментировать
  • Как написать SQL запрос?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Более быстрый вариант
    SELECT city.name
    FROM city 
    WHERE city.name 
           IN (SELECT ad_cars.city FROM ad_cars)
    Ответ написан
    Комментировать
  • Как уменьшить кол-во case'ов, и просто подтянуть по другой таблице?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Данный SQL запрос - это конечно ужас-ужас и кроме того здесь есть такие
    справочные сведенья которые надо-бы не хардкодить в коде а фиксировать
    во таблицах справочниках. Иначе через некоторое время будет противоречие.
    Код будет отставать от актуального положения вещей.

    Тебе на самом деле выгоднее не делать select а сделать один раз процессинг таблицы
    и декодировать поле baza один раз и сохранить его в другое поле.

    Это кажется называется enrichment. Обогащение. Хранимой процедурой можно.
    Ответ написан
    Комментировать
  • Как составить запрос SQL с разнесением данных из одного столбца по другим?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тебе понадобиться функция PIVOT.

    Посмотри пример. Там легко https://www.oracletutorial.com/oracle-basics/oracl...
    Ответ написан
    2 комментария
  • Как можно дать несколько условии(значение) в like например like ('%1%', '%2%' и тд)?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Можно попробовать механизм регулярок

    SELECT ....... WHERE REGEXP_LIKE(tranz_acct , '.*(99449872|23424232).*')

    но сравни производительность в обоих случаях. Обычно регулярки не могут использовать индекс.
    Поэтому будет FULL_TABLE_SCAN. В случае с like выражениями у тебя есть шанс пойти
    в план с INDEX_SCAN но нужно пересмотреть саму задачу. Откуда цифры.
    И можно ли во всех кейсах выделить общий префикс например.
    Ответ написан
    5 комментариев
  • Как запросить по 2 записи из каждой категории с лучшим рейтингом?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Кажется можно решить через оконные функции. Посмотри как тут https://dev.mysql.com/doc/refman/8.0/en/window-fun...

    Пригодится RANK или LEAD.
    Ответ написан
    1 комментарий
  • Как подставить значение в запрос sqlite?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Коробочное решение этой задачи называется SQL-Builder.

    Вот пример такого https://pypika.readthedocs.io/en/latest/2_tutorial...

    Использовать string interpolation здесь технически возможно, но не выдерживает критики
    по инфо-безопасности. Атака на инжекцию - это Top 10 уязвимостей софта в 21 веке.

    Вот об этом коллеги тоже пишут в ответах.
    Ответ написан
    Комментировать
  • Как избавляться от ненужных записей в бд?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если использовать такие БД как DymanoDb, CosmosDb, Cassandra или кеш Redis, то там сразу
    можно создавать записть с отметкой TTL и указывать сколько времени запись будет актуальна.
    Впоследствии эту отметку можно продлить или сделать живщуей вечно.

    По поводу реляционок типа Postgres.

    В хранении ненужных записей я не вижу проблемы до тех пор пока вы в состоянии такие
    токены идентифицировать и почистить отдельно с помощью джоба который запускается
    раз в сутки например и просто удяляет их по признаку например "состояние ожидания
    ввода числа из СМС". Трекайте это состояние и все будет ОК.
    Ответ написан
    Комментировать
  • На сколько популярно и корректно хранить данные в столбце в виде JSON строки?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В конце 20-го века, когда Эдгар Кодд развивал свою реляционную теорию было очень
    модно все данные нормализовывать для хранения их в БД. Это соотвествовало экономии
    ресурсов (диски мерялись килобайтами и мегабайтами) и нормализация хорошо ложилась на
    техно-стек. Все данные должны быть атомарны. И ты - плохой DBA и программист если
    кладешь в ячейку что-то более комплексное чем просто атом.

    В 2000х развитие веб и XML(XHTML/SGML, XSLT, XPath) дало толчок новым видам
    хранения информации в виде markup languages. Появляются технологии семанического веба.
    Мечтатели-теоретики создают RDF, OWL. Базы данных пытаются успеть втянуть в себя новые типы.
    Oracle начинает поддерживать XML+Schema как тип данных в таблице. Браузер начинает
    поддерживаеть трансформацию XML и обогащение его стилями. XML - моден. Его внедряют
    везде где можно и где не нужно. Даже в конфигах Apache Http и в сборщике Maven.

    Параллельно Дуглас Крокфорд работает над Java Scrip Obj Notation и создает лайтовый язык
    для описания объектов и документов. Они - конкурируют с XML но JSON практически побеждает
    в вебе, полностью захватывая веб протоколы (Ajax, WebSockets, e.t.c). И интеракцию с сервером.
    JSON становится более популярный для REST. Многие БД тоже начинают поддерживать JSON.
    Postgres даже делает бинарный JSON и добавляет спец-индексы для быстрого поиска атрибутов.
    Узко-специализированные системы такие как Mongo изначально заточены на храннение JSON
    информации.

    BigData плавно проростает в 2007 (кажется) и где-то в 2014 (или позже) году фреймворк Spark начинает поддерживать DataFrames + Structured Types которые по сути являются зеркалом JSON. Фреймворк
    позволяет грузить в бигдату JSON-lines датасеты, автоматически выводя схему.

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

    Если поискать анти-паттерны применения JSON в базах данных - то я-бы предложил такую метрику.
    Если вы очень часто обновляете маленькое поле внутри большого JSON документа и это создает
    сильные I/O нагрузки то скорее всего вам надо перепроектировать вашу БД как-то по другому
    и вынести это поле во вне по отношению к документу
    Ответ написан
    5 комментариев
  • Как сравнить структуры двух БД и создать скрипт миграции?

    mayton2019
    @mayton2019
    Bigdata Engineer
    быстро сравнить структуры БД и сделать скрипт, который приводит одну БД к структуре второй?

    В этой задаче - большое количество подводных камней. Например что делать если в двух БД есть одинаковые
    поля но имеющие разный тип (NUMERIC / VARCHAR). Дилемма... Что делать с исчезающими полями?
    Удалять? Дилемма...

    Я вообще не видел коробочных решение которые бы работали на "раз-два-три". Всегда есть нюансы.
    И есть conditions которые нужно вбить или вкрутить в эти решения.

    Написать скрипты которые извлекают метадату из одной и из другой БД не очень сложно. Но само практическое
    применение подобных скриптов - ограничено. И я думаю что это как раз та причина по которой коробочные
    "миграторы" не прижились.
    Ответ написан
    Комментировать
  • В какой базе данных лучше всего хранить данные для дашбордов?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вы можете материализовывать дашборд. Тоесть фактичекски делать его хард-копию.
    Он ведь не меняется? Верно? И отдавать статический html.

    А в базе - отслеживать бухгалтерию вот как предлагали уже.
    Ответ написан
    5 комментариев
  • 5 млн файлов JSON или DB?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Файловая система - самый дешевый способ хранения инфы. Если других требований нет - почему бы и нет?
    Ответ написан
    4 комментария
  • Можно ли организовать фильтр/поиск товаров посредством JSON_EXTRACT?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я-бы переделал табличку. Пускай мета-данные по продуктам лежат в виде битовых полей.

    create table product(
      ....
      params_group1 BINARY(100),
      params_group2 BINARY(100),
      params_group3 BINARY(100)
    )


    И дальше булевыми (bitwise) операциями как тут пишут https://dev.mysql.com/doc/refman/8.0/en/bit-functi... делать поиски продуктов по маске свойств.
    Ответ написан
  • Как формировать сырые SQL запросы максимально эффективно?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я в самодельных билдерах запросов добавлял фейковый предикат 1=1 который всегда был. Тогда добавление новых предикатов делается проще. Вот как-то так.

    def get_user(*, username: str = None, email: str = None, id: int = None, is_blocked: bool = None):
        SQL = "SELECT * FROM USERS {} LIMIT %s OFFSET %s WHERE 1=1 "
        more = []
        if username:
            more.append("AND username = '%s'" % username)
        if email:
            if any([username]):
                more.append("AND email = '%s'" % email)
        if id:
            if any([username, email]):
                more.append("AND id = '%s'" % id)

    Я проверял этот код на валидность. Это лишь идея как сделать. Поэтому исправляй дальше сам.
    Ответ написан
    Комментировать
  • Как оптимальнее всего организовать хранение тяжёлых данных и чтобы потом максимально быстро доставать оттуда данные для отчётов?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я знаю два сильных пути оптимизации в БД.

    1) Минимизация IOps. Тоесть уменшить число дисковых чтений. Для таблиц это достигается через
    partitions by date. Вычисляешь экспериментально оптимальный размер partition (например 1 неделя).
    И твои запросы по диапазону должны попадать в 1-2 partitions. Это исключает full-table-scan.
    Ну и индекс попробуй построить по предикатам фильтров.

    2) Материализация ответов. Для данных которые уже не будут изменяться ты строишь где-то такую
    табличку (матрицу по сути) где хранишь уже заранее расчитанные данные. Эта технология по разному
    может называться. Materialized View. OLAP cubes. Витрины данных. Но суть одна.

    start_date    end_date     result 
    01-02-2023    03-02-2023   { "1":"65", "2":"45" }


    И индекс по двум датам.
    Ответ написан
    Комментировать
  • Как лучше хранить данные фиксированных таблиц в JSON или в отдельных полях?

    mayton2019
    @mayton2019
    Bigdata Engineer
    JSON хорошо подходит для хранения неспецифицированных данных. Например у вас есть таблица товаров.
    У товара есть базовые свойства такие как цена, категория, название и производитель.
    А есть описалово товара где например для ТВ-панели будет около 50 параметров таких как диагональ,
    яркость матрицы, и прочая техническая чепуха. Вот эти 50 параметров можно положить в JSON (или JSONB)
    для Postgres. Потому что в магазине всегда есть прецензиозные клиенты которым нужна посудомойка розового цвета и встраиваемая и еще ценой такой-то и такой-то. Вот спецом для них такая структура может быть создана.

    Поэтому ответ тут может быть такой. Эти две техники не исключают друг друга. Вы можете использовать
    классическую таблицу с полями и +дополнительно иметь сет неспецифицированных полей.
    Ответ написан
    Комментировать
  • Производительность структуры базы данных для игры?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Как в такой схеме реализуются связи?

    Обычно в игровой логике избегают использования SQL систем из-за unpredictable времени
    отклика. Тоесть если в финансовой системе вы можете подождать секунд 5 или минутку
    обработки транзакций то внутри игры игрок быстро заскучает и выйдет из игры.

    Поэтому в играх обычно используют NoSQL системы (наподобие RocksDb, Cassandra)
    но в них доступ идет только по ключу. Key-Value и никакие JOINS не работают.

    Если сильно хотят подружить игру с платежной системой - то заводят отдельный сервер
    для денежных операций (он может быть под SQL БД) но события между игрой и платежной
    системой гоняют по очередям (MQ) чтоб не было нигде блокирующих операций.

    Поэтому твой вопрос по сути - это квест. Типа пойдешь на право - перформанс потреяшь
    или пойдешь налево - вырастет денормализация и аномалии в БД.
    Ответ написан
  • SQLite Как выбрать записи, текстовое поле которых содержит подстроку, регистронезависимо?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если это одноразовая задача то поищи UPPER(value) LIKE '% ET%'

    Если искать надо будет много - то почитай про

    CREATE VIRTUAL TABLE .............. USING FTS5 ........
    Ответ написан
    Комментировать
  • Какую структуру таблиц выбрать для описания некоторой сущности, у представителей которой часть атрибутов совпадает, а часть - различна?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Путей много. Можно завести 2 таблички. Одна для новых машин. Другая - для подержанных. Со
    своими наборами пропертей. Тогда и индексы строить удобно.
    И с точки зрения типизации этот подход верный. Если язык разработки (Python/PHP) различает
    типы машин - то для каждого типа нужна отдельная табличка. Это в духе ORM.
    Недостаток - надо делать union all двух таблиц если мы хотим делать поиск по общим пропертям.

    Можно завести 1 табличку с полем типа JSON и свалить туда все проперти которые могут быть
    опциональны для новых машин и для Б/У. Это делает схему более компактной. И поиск по основным
    полям работает универсально. Для кастомных полей надо искать описание в MySQL языков работающих
    с JSON (JSonPath) для того чтоб выбирать и фильтровать и индексировать их.

    Можно поступить как в BigData. Свалить все проперти что есть в одну большую таблицу. Будет в ней
    допустим 500 колонок. И большая часть из них - пустая. Заполняется null. Такая модель тоже работоспособна.
    Но для человека наблюдающего глазами таблицу будет неудобно с ней работать. Особенно когда нужное
    тебе поле находится где-то на 400х колонках и надо скроллить грид мышкой вправо чтоб хотя-бы прочитать
    глазами значения. И эволюция такой схемы проходит тяжелее. Т.к. alter table обычно блокирует таблицу
    от транзакций DML и нужен регламент что добавлять новую колонку.
    Ответ написан
    Комментировать