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

    @Olteya
    Я бы отталкивалась от того, что разница между текущим и предыдущим period_id составляет 1 до смены периода. На строке с period_id = 208 вы получите разницу в 2, в следующий раз на строке с period_id = 211.
    Получается, там, где получите значение 2 - это начало нового периода. Предыдущая строка - конец предыдущего периода.
    Соответственно вы можете получить таблицу (или CTE) с данными:
    period_start period_end row_num
    0 206 1
    208 209 2
    211 214 3
    216 218 4
    и сджойнить ее с исходной по условию period_start <=period_id (первой табл.)<= period_end.
    Может быть не оптимальное решение, но в ночи только это пришло в голову :)
    Ответ написан
    Комментировать
  • Как составить запрос SQL с разнесением данных из одного столбца по другим?

    @Olteya
    select 
    Услуга
    , Сумма
    , case when Услуги ='тв' then Сумма else null /*или cast(null as number)*/ end "Сумма за тв"
    , case when Услуги ='интернет' then Сумма else null /*или cast(null as number)*/ end "Сумма за интернет"
    from Услуги;
    Ответ написан
    Комментировать
  • Как правильно сформулировать запрос?

    @Olteya
    Думаю, что у вас лишние условия на company_marker, в задании то, что относится к этому полю, выглядит как описание того, что лежит в таблице, а не условие отбора. В таком случае нужно просто выбрать указанные поля по условию "Оставьте записи только о тех покупателях, которые в первый раз подключились в зоне «Роботический лабиринт".
    SELECT first_name
    connection_area
    company_marker
    FROM buyer
    WHERE connection_area = 'Роботический лабиринт'.
    Ответ написан
  • Как правильно сформировать Query Builder код в SQLALCHEMY?

    @Olteya
    Совершенно непонятно, что вы хотите этим получить.
    Ошибки в вашем запросе:
    1) лишняя скобка после "as cars_list"
    2) SELECT DISTINCT car from mytable - что это за mytable? это та же таблица my_table с ошибкой?
    Если да, то запрос должен выглядеть так:
    INSERT INTO my_table(id, username, country, age, is_car_owner, car)
    SELECT
        15 as id,
        'daniel' as username,
        country_list.country,
        18 as age,
        True as is_car_owner,
        cars_list.car
    FROM
        (SELECT DISTINCT car from my_table) as cars_list
    CROSS JOIN
        (SELECT DISTINCT country from my_table) as country_list;

    4) Проверяйте, работает ли у вас SELECT (без INSERT).
    3) Если SELECT работает, а INSERT нет, смотрите, какой PK у вашей таблицы my_table? Возможно, пытаясь вставить полученные в SELECT данные, вы получите нарушение уникальности.
    В целом смысл манипуляций мне не понятен.
    Ответ написан
    Комментировать
  • Как найти общие поля в таблицах?

    @Olteya
    Фактически задача сводится к поиску количества совпадений значений каждого атрибута таблицы А со значениями каждого атрибута таблицы Б.

    Можно попробовать используя метаданные построить список запросов вида:
    select
    (select count(*) from A where A.column_name1 in (select B.column_name1 from B )) as column_name1_x_column_name1,
    (select count(*) from A where A.column_name1 in (select B.column_name2 from B )) as column_name1_x_column_name2 и т.д.


    Пример для postgres:
    with B as
    (
    select table_name, column_name, data_type from information_schema.columns c where c.table_name in ('product') --название таблицы А
    )
    , common as (
    select A.table_name A_table_name, A.column_name A_column_name,
    	B.table_name B_table_name, B.column_name B_column_name from information_schema.columns as A
    inner join  B on  A.data_type = B.data_type
    where A.table_name in ('printer') --название таблицы Б
    )
    
    select '(select count(*) from ' || common.A_table_name || ' where ' || common.A_column_name || ' in (select '|| B_column_name || ' from ' || B_table_name || ' )) as ' || A_column_name || '_x_' || B_column_name || ',' from common

    Вариант соединения для примера сделан по типам данных.
    Далее оборачиваете еще в один select и выполняете.
    Получается что-то вроде:
    65ccf2ae8fa9e028148349.jpeg где видно количество совпадений.
    Результат, конечно, не означает, что по этим полям можно соединять таблицы. Это могут быть ссылки на таблицу С, например. Или совпадающие даты. Дальше нужно анализировать.
    Если правильно понимаю, у автора таблицы с большим количеством столбцов без описания. Так можно хотя бы сузить диапазон поиска.
    Ответ написан
    Комментировать