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

    @Akina
    Сетевой и системный админ, SQL-программист.
    В коде SQL запрос выглядит так:
    SELECT ANY_VALUE(title) AS title_list,
           SUM(count_model) AS count_model,
           COUNT(*) AS total,
           ANY_VALUE(created_at) AS `date`
    FROM mymodels
    GROUP BY name_list
    ORDER BY name_list;

    https://dbfiddle.uk/tiX1HDll

    Возможно вместо ANY_VALUE использовать MIN/MAX, это не изменит результата, хотя и противоречит логике.
    Ответ написан
    3 комментария
  • Как написать SQL запрос, чтобы при нахождении одной записи с определенным значением поля, другие записи с таким же значением не выводились?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Общий шаблон такой:

    SELECT article_id
    FROM tag2article
    GROUP BY article_id
    HAVING !SUM(tag_id = 1)


    Подобный подход позволяет формировать условия любой степени сложности, например:
    SUM(tag_id = 2) -- наличие тега 2 обязательно
    SUM(tag_id IN (3,4)) -- наличие хотя бы одного из указанных тегов обязательно
    !SUM(tag_id IN (5,6)) -- отсутствие любого из указанных тегов обязательно
    SUM(tag_id IN (7,8)) = 1 -- обязательно наличие строго одного из двух указанных

    Ну и так далее... а с учётом того, что такие условия объединяются логическими операторами, можно состряпать фильтр практически любой сложности.

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    Да тупо проверить все... DEMO fiddle (ищется строго одна единица в поле на всю таблицу). Возвращается имя первой по списку колонки, которая соответствует заданному критерию, либо 'none', если ни одна колонка не соответствует.

    SELECT CASE WHEN SUM(CASE WHEN col1 = 1 THEN 1 END) = 1 THEN 'col1'
                WHEN SUM(CASE WHEN col2 = 1 THEN 1 END) = 1 THEN 'col2'
                WHEN SUM(CASE WHEN col3 = 1 THEN 1 END) = 1 THEN 'col3'
                ELSE 'none'
                END where_only_one_1
    FROM test;
    Ответ написан
    Комментировать
  • Где ошибка в данном sql запросе?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если нормально отформатировать, получается
    SELECT *
    FROM (
        SELECT toStartOfInterval(time_local, interval 3600 SECOND) AS interval,
               remote_addr,
               count(DISTINCT http_user_agent),
               count(http_user_agent)
        FROM accesslog.default
        WHERE time_local > (now() - toIntervalMinute(240))
        GROUP BY interval, remote_addr
        ORDER BY interval, remote_addr
        ) AS t1
    INNER JOIN (
        SELECT *
        FROM accesslog.default
        WHERE time_local > (now() - toIntervalMinute(240))
        ) AS t2 ON t1.remote_addr=t2.remote_addr

    Так хорошо видно, что к собственно запросу претензий быть не должно.

    А то, что сам кликхаус в процессе выполнения протерял одно поле подзапроса - это именно к нему, а не к запросу, претензии.. может, данных многовато, а оперативки в обрез?
    Ответ написан
    Комментировать
  • Как объединить 2 SQL запроса в один?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT *
    FROM ( запрос1 ) AS subquery1
    JOIN ( запрос2 ) AS subquery2 USING (departments)

    ORDER BY из подзапроса, само собой, убрать - но, возможно, добавить в объединённом запросе.
    Ответ написан
  • PostegreSQL. Как правильно создать структурированную таблицу с select?

    @Akina
    Сетевой и системный админ, SQL-программист.
    CREATE TABLE log AS (
      WITH cte AS (
        SELECT STRING_TO_ARRAY(txt, ' ') parsed
        FROM t1
      )
      SELECT LEFT(parsed[2], 8) :: DATE dt,
             parsed[3] link,
             ARRAY_TO_STRING(parsed[6:100], ' ') agent,
             t2.city
      FROM cte
      LEFT JOIN t2 ON cte.parsed[1] = t2.ip
      );

    fiddle

    PS. Нужны конкретные типы данных в итоговой таблице - добавь соотв. приведение типов в SELECT, как сделано для поля dt.
    Ответ написан
    Комментировать
  • Как правильно сделать запрос в бд?

    @Akina
    Сетевой и системный админ, SQL-программист.
    как сформировать запрос чтоб было равенство 2021-10-30 23:59:59 = 10.21

    Если критерий предоставляется именно в такой форме - '10.21',- то
    SELECT * 
    FROM `table` 
    JOIN ( SELECT '10.21' AS parameter) criteria
        ON  `date` >= CONCAT('20', SUBSTRING_INDEX(parameter, '.', -1), '-', SUBSTRING_INDEX(parameter, '.', 1), '-', '01' AS DATE)
        AND `date` < CONCAT('20', SUBSTRING_INDEX(parameter, '.', -1), '-', SUBSTRING_INDEX(parameter, '.', 1), '-', '01' AS DATE) + INTERVAL 1 MONTH

    Условие - SARGable.
    Ответ написан
    Комментировать
  • Как вывести все остальные поля при операции GROUP BY?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY score DESC) rn
        FROM source_table
    )
    SELECT *
    FROM cte
    WHERE rn = 1
    -- ORDER BY score DESC LIMIT nnn
    ;
    Ответ написан
    Комментировать
  • Как получить нужные данные?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Может, требуется тривиальное
    SELECT *
    FROM tablename
    ORDER BY client_id IS NULL, hub_id IS NULL
    LIMIT 1

    ?
    Ответ написан
    1 комментарий
  • Как посчитать по двум полям SQL Server?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT SUM(some), SUM(some * noone)
    FROM table

    ?
    Ответ написан
    1 комментарий
  • Можно ли в хранимых процедурах создать временную функцию?

    @Akina
    Сетевой и системный админ, SQL-программист.
    CREATE FUNCTION не входит в список конструкций, разрешённых к использованию в stored objects (procedures, functions, triggers, event procedures) и prepared statements.

    Ответ: НЕЛЬЗЯ.

    PS. В MySQL нет временных функций, все функции - статические. Встроенные, регистрируемые либо хранимые.
    Ответ написан
    1 комментарий
  • Как посчитать количество сотрудников в штате за каждый месяц в каждом году?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH RECURSIVE
    cte AS ( SELECT CAST(DATE_FORMAT(@range_from, '%Y-%m-01') AS DATE) month_start,
                    LAST_DAY(@range_from) month_end
             UNION ALL
             SELECT month_start + INTERVAL 1 MONTH,
                    LAST_DAY(month_start + INTERVAL 1 MONTH)
             FROM cte
             WHERE month_start < DATE_FORMAT(@range_till, '%Y-%m-01')
    )
    SELECT cte.month_start, COUNT(employee.id) employees_amount
    FROM cte
    LEFT JOIN employee ON employee.date_employment <= cte.month_end
                      AND (    employee.date_dismissal >= cte.month_start
                            OR employee.date_dismissal IS NULL )
    GROUP BY 1;

    https://dbfiddle.uk/?rdbms=mariadb_10.4&fiddle=8be...
    Ответ написан
    4 комментария
  • Rак записать id в Postgres?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Использовать надо INSERT .. SELECT
    WITH cte_id  AS (
        INSERT INTO words (name_word, discription_word) 
        VALUES ('cool', 'круто') 
        RETURNING Id
    )
    INSERT INTO users_words (users_id, words_id, status_learn_word)
    SELECT 649651821, id , 0
    FROM cte_id;
    Ответ написан
    Комментировать
  • В чем ошибка sql-запроса?

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

    Формально запрос содержит несколько ошибок и недочётов.

    • Основная ошибка, вернее, опечатка - это WARCHAR вместо VARCHAR. Она фатальна.
    • Вторая по тяжести ошибка - это использование служебного слова number в качестве имени поля. В части диалектов SQL это слово - зарезервированное, и тогда эта ошибка тоже фатальна.
    • Третье - это скорее не ошибка, а самообман. Речь об указании длины для полей типа INT. В подавляющем большинстве диалектов, где указание длины допускается, оно просто игнорируется, а потому указание просто не имеет смысла. Если для поля number требуется ограничить возможные значения двумя цифрами, разумнее использовать поле типа TINYINT с соответствующим CHECK constraint.
    • Ну и длина поля типа VARCHAR - опять же ограничение в 55 символов разумнее делать с помощью CHECK constraint, а длину поля задавать максимальную, не приводящую к увеличению потребляемого дискового пространства. С учётом того, как хранятся строки переменной длины, VARCHAR(255) в большинстве диалектов будет наилучшим решением.
    Ответ написан
    Комментировать
  • Как сделать SQL выборку по максимальной дате?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если текущая версия СУБД поддерживает оконные функции - то ROW_NUMBER() в CTE и отбор по rn=1 во внешнем запросе.
    WITH cte AS (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY list_name ORDER BY date DESC) rn
        FROM table
        )
    SELECT *
    FROM cte
    WHERE rn = 1

    Если не поддерживает - агрегирующий подзапрос, который для каждой категории получает максимальную дату, и отбор записей по этим значениям из другой копии таблицы.
    SELECT t1.*
    FROM table t1
    NATURAL JOIN (
        SELECT list_name, MAX(date) date
        FROM table
        GROUP BY 1
        )

    Оба запроса предполагают уникальность (list_name, date).
    Ответ написан
    Комментировать
  • Как выбрать нужные записи из бд?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT *
    FROM table
    ORDER BY user_id = @user_id DESC, id DESC LIMIT 1

    Если заданный @user_id есть - вернётся соотв. запись. Если таких записей несколько - вернётся запись из них с максимальным id. Иначе вернётся просто запись с макс. id.

    Если же под "Если есть user_id вернуть запись с user_id" разумеется "ну хоть какой-то, лишь бы не NULL", то
    SELECT *
    FROM table
    ORDER BY user_id IS NULL, id DESC LIMIT 1
    Ответ написан
    Комментировать
  • Как вывести элемент, если нет связи many to many?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Шаблон при решении такого рода задач следующий:
    SELECT *
    FROM products 
    CROSS JOIN categories
    LEFT JOIN products_category USING (product_id, category_id)

    CROSS JOIN генерирует все возможные комбинации, а потом LEFT JOIN либо присоединяет к комбинации реально существующие данные, либо нет - тогда в соотв. полях одни NULL. Ну а что именно выводить - это уже решается по конкретной задаче.
    Ответ написан
  • Как выбрать дочерную категорию при формировании фида?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT t1.*, t2.category_id AS main_category_id
    FROM table t1
    JOIN table t2 USING (product_id)
    WHERE {условия по таблице t1, определяющие нужный продукт}
      AND t2.main_category
    Ответ написан
    2 комментария
  • Как прибавить к текущей дате дни?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В случае MySQL просто прибавить соотв. INTERVAL:
    INSERT INTO `order`
    SET ...
        date_end = CURRENT_DATE + INTERVAL :days_to_add DAY

    В других СУБД - использовать функцию DATEADD().
    Ответ написан
    Комментировать
  • Как запустить OPTIMIZE_TABLE через shell скрипт для конкретных БД?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Создайте хранимую процедуру, которая принимает имя БД и выполняет нужную команду для каждой таблицы базы. И выполняйте её.
    Ответ написан
    Комментировать