Задать вопрос
  • Как выбрать дату последней транзакции (чтоб эта транзакция была 7 дней назад)?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT id AS servie_id,
           name AS servie_name,
           MAX(TO_TIMESTAMP(created_at))::DATE AS last_trans_date
    FROM services
    GROUP BY 1,2
    HAVING last_trans_date <= CURRENT_DATE - INTERVAL '7 day'
    Ответ написан
    Комментировать
  • Где ошибка в EXECUTE FORMAT?

    @Akina
    Сетевой и системный админ, SQL-программист.
    CREATE OR REPLACE FUNCTION _Foo2(st TIMESTAMP, fin TIMESTAMP)
    RETURNS TABLE (out_key INTEGER, out_tst timestamptz, out_val FLOAT) AS $$
    DECLARE  
      
    BEGIN
    
      RETURN QUERY EXECUTE FORMAT('
      SELECT %I, %I, %I
      FROM %I 
      WHERE %I BETWEEN ''%s'' AND ''%s'';
      ', 
      'in_key', 'in_tst', 'in_val', 'in_table', 'in_tst', st, fin);
    
    END;
    
    $$ LANGUAGE plpgsql;


    DEMO fiddle

    Ошибки найдёте самостоятельно...
    Ответ написан
    1 комментарий
  • Как исправить ошибку Cannot add or update a child row: a foreign key constraint fails?

    @Akina
    Сетевой и системный админ, SQL-программист.
    высвечивает такую ошибку

    Ну тебе же вменяемо говорят, что не выполняется ограничение.

    Согласно ограничению то значение, которое ты вставляешь в поле dispatcher таблицы transportation в базе данных auto, уже должно существовать в поле id_dispatcher таблицы dispatcher той же базы.

    Так что следи, что идентификатор диспетчера, который ты присваиваешь полю, взят не с потолка.
    Ответ написан
    5 комментариев
  • Как сделать модуль VBA по умолчанию при создании книги Excel?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Есть минимум два варианта.
    Первый - предпочтительный, но ссылку на него уже дал datka.
    Второй - откорректировать шаблон по умолчанию. См. тут
    Ответ написан
    Комментировать
  • Как удалить все в строке после последнего пробела через Notepad++?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Найти: +[^ ]+$ (в начале перед плюсом один пробел)
    Заменить: (пустая строка)

    Режим - регулярные выражения, зацикленный поиск.

    Удаляет всё от последнего пробела до конца строки, если строка оканчивается не-пробелом. Удаляет и сам последний пробел (если их несколько - удаляет все). Если последний символ в строке пробел - не удаляет ничего.
    Ответ написан
    Комментировать
  • Как лучше сохранять дату и время?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Дата в описанном случае - это не отдельная сущность-свойство сущности Измерение, а атрибут экземпляра этой сущности.

    Соответственно "справочник дат" - дурь, не имеющая права на существование.

    Для хранения дат в любой СУБД есть соответствующие встроенные типы (их, как правило, не один). Хранение значения даты "кусками" - точно такая же не имеющая право на существование дурь. До тех пор пока выделяемые в отдельные поля компоненты этой даты не являются самостоятельной сущностью. Но в этом случае вычисляемое поле скорее всего будет более разумным решением.
    Ответ написан
    Комментировать
  • Какие ограничения несёт в себе INSERT IGNORE для секционированных таблиц?

    @Akina
    Сетевой и системный админ, SQL-программист.
    INSERT INTO может привести к ошибке. По любой причине. При этом процесс вставки прерывается, а все уже внесённые в таблицы изменения - откатываются.

    INSERT IGNORE преобразует ошибку в предупреждение. При этом выполнение запроса продолжается, а запись, попытка вставки которой привела к ошибке, не вставляется.

    Замечание. Дублирование - не единственное событие, которое может вызвать ошибку. Может быть ещё куча причин (CHECK constraint, SIGNAL из триггера, нарушение внешнего ключа и т.п.). Причём далеко не все типы ошибок восстановимы и могут быть проигнорированы/преобразованы в предупреждение. Если ошибка невосстановимая (как правило, это системные или внешние ошибки) - запрос прерывается по ошибке и откатывается обычным образом.

    Замечание 2. Всё вышеописанное никак не пересекается с секционированием. За исключением случая, когда значение поля не соответствует диапазону ни для одной из секций. В этом случае IGNORE срабатывает штатно - ошибка преобразуется в предупреждение, проблемная запись не вставляется.

    Нужно игнорировать дублирующиеся данные. Буду делать INSERT IGNORE

    Кроме INSERT IGNORE INTO есть ещё два типа запросов, которые обрабатывают ошибку дублирования данных - это INSERT .. ON DUPLICATE KEY UPDATE и REPLACE INTO. Изучите их - возможно, какой-то из них лучше подходит для Вашей конкретной задачи. При этом REPLACE не поддерживает модификатор IGNORE и не может игнорировать другие ошибки.
    Ответ написан
    2 комментария
  • #1045 - Доступ закрыт для пользователя 'root'@'127.0.0.1', что делать?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В OpenServer -> PHPMyAdmin я создал юзера root1

    Мало создать юзера, надо ещё дать ему необходимые для работы права. Хотя бы элементарно на чтение для той БД, которая указана как база по умолчанию.

    Вот параметры юзера

    Право USAGE - это синоним права “no privileges”. Т.е. свежесозданный юзер - абсолютно бесправен.

    Читайте и применяйте GRANT Statement. Особое внимание обратить на WITH GRANT OPTION.
    Ответ написан
    Комментировать
  • Как заставить работать COUNT с GROUP BY?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Надо подсчитать количество строк в ответе запроса вида

    Вариантов несколько.

    Первый, наиболее правильный - получить это значение отдельным запросом.
    SELECT COUNT(*)  AS cnt
    FROM (
        SELECT 1
        FROM "order" AS o
             LEFT JOIN product p ON (p.order_id = o.id)
        GROUP BY o.id
        HAVING sum(p.price) >= 10
    ) x


    Второй - используя средства языка программирования или библиотеки доступа, получить количество записей в наборе записей. Обычно подобное свойство у рекордсета присутствует.

    Третий - добавить соотв. поле в каждую запись выходного набора, используя оконную функцию, и взять значение из любой записи:
    SELECT o.id, COUNT(o.id) OVER () AS cnt
    FROM "order" AS o
             LEFT JOIN product p ON (p.order_id = o.id)
    GROUP BY o.id
    HAVING sum(p.price) >= 10
    Ответ написан
  • Как объединить два запроса в один?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT order.ID, 
           order_status.Name StatusName, 
           order.Name OrderName, 
           order.Phone
    FROM order
    JOIN order_status ON order.status = order_status.id

    Если соответствие в таблицах задано иначе - исправь ON clause.
    Ответ написан
    2 комментария
  • Агрегирование в контексте группы и оконной функции?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Как отработает этот запрос?
    внутренний sum посчитает сумму в рамках групп бай, если ins_date равна cur_date, а потом внешний sum суммирует полученный результат в контексте секций?

    Именно так и будет. Считай, что оконные функции работают после HAVING и перед ORDER BY.
    Ответ написан
    Комментировать
  • Как правильно удалить все строки с минимальным значением поля?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Удалить только самые старые (оставить все остальные)
    DELETE t1
    FROM table t1
    LEFT JOIN table t2 ON t1.dup_column = t2.dup_column
                      AND t1.time_column > t2.time_column
    WHERE t2.time_column IS NULL

    Оставить только самые новые (удалить все остальные)
    DELETE t1
    FROM table t1
    JOIN table t2 ON t1.dup_column = t2.dup_column
                 AND t1.time_column < t2.time_column


    Суть задачи удалить все дубли квартир приходящие с разных импортов, по умолчанию считаем что последний файл импорта актуальный

    Создай уникальный индекс по номеру квартиры (после чистки, само собой) и используй не INSERT INTO, а REPLACE INTO.
    Ответ написан
  • Как получить всю БД в виде csv?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Задача недоопределена.

    Например, под термином CSV можно понимать как файл единой структуры (причём как plain-структуры, так и с сериализованными данными), так и несколько конкатенированных (как в процессе вывода, так и явно по окончании вывода) файлов, каждый из которых имеет свою структуру (да ещё и дополнительная информация там может храниться, вроде имён таблиц и имён/типов полей).

    Каждый из вариантов предполагает свой код для решения задачи (это если не обращать внимания на такую мелочь, что сама по себе запись в CSV в каждой СУБД делается тоже ну очень по-своему).

    А так - вот не вижу ну никакой проблемы. Лишь бы на той стороне обработки этого CSV был код, который правильно интерпретирует данные и корректно разложит их обратно по таблицам. Причём если идёт речь о создании универсального инструмента, то только в этом самом последнем моменте (вывод результата запроса в CSV) могут возникнуть хоть какие-то сложности. Остальное просто и плоско, как блин.

    Я не знаю их архитектуру и название таблиц заранее

    Хотя вот ещё одна точка, где могут возникнуть сложности. Теоретически все СУБД должны бы поддерживать INFORMATION_SCHEMA, всё же стандарт как бы описывает - и всё равно не всё там просто и очевидно.
    Ответ написан
    2 комментария
  • Как обозначить тип сортировки?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Передавайте индекс выражения сортировки. А по этому индексу - либо выполняйте соответствующий заранее полностью подготовленный запрос, либо стройте текст запроса на основании переданного индекса.

    Передача части запроса, которая потом будет встроена в текст запроса - плохая идея, ибо чревато инъекцией. Условное выражение на основании переданного параметра этого недостатка лишено, но похоронит возможность использования индексов для сортировки, если они могут быть применены в частной форме запроса.
    Ответ написан
    2 комментария
  • «Новый» подход к рекурсии?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Что-то уж больно на бред воспалённого сознания похоже.

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

    Но можно начать и с обычных чисел Фибоначчи.


    В случае рекурсивной реализации ряда Фибоначчи это условие n<2 и специальное значение 1. Смешно, но совершенно такие же и условие, и спецзначение у Хофштадтера.
    Ответ написан
    Комментировать
  • PostgreSQL как выбрать всех у кого день рожденья 16 февраля?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT *
    FROM table
    WHERE to_char(dob, 'MMDD') = '0216'
    Ответ написан
  • Возможно ли задать приоритет обработки конкретным таблицам?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Эти операции может, и приоритетны, но за пределами MySQL. Вот там и решайте эту проблему.

    В MySQL Community Server нет ничего подобного в принципе. А вот в Enterprise имеется MySQL Enterprise Thread Pool, умеющий приоритезировать соединения (не запросы).

    В принципе можно ещё покопаться в MySQL proxy и аналогичных. Может, и там что сыщется.
    Ответ написан
    1 комментарий
  • Как удалить в Mysql все записи кроме последнего т.е MAX(id)?

    @Akina
    Сетевой и системный админ, SQL-программист.
    DELETE t1 
    FROM test t1
    JOIN test t2 ON t2.id > t1.id;

    https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=19cb29...
    Ответ написан
    Комментировать
  • Как правильно работать со временем в таблице?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Работа с датой ускоряет или усложняет процесс, если ее заменить вбиванием цифр вручную по типу 15122021?
    Аналог 15 12 2021

    Серверу глубоко похрен. Главное - соблюдать допустимый формат. Любой из MySQL 8.0 Date and Time Literals. Просто помни, что "вбивание цифр вручную" - это прямой путь к опечаткам, а они чреваты боком...

    Как ее сделать авто добавляемой для каждого заказа и осуществлять после переборку по ним?

    И откуда ему взяться? ветром надует?
    А если есть вменяемый алгоритм формирования значения - то его следует запрограммировать. Если допустимо - то как DEFAULT в структуре таблицы, иначе в BEFORE INSERT триггере.
    Ответ написан
    2 комментария