• Как проранжировать числа в столбце на группы?

    @Olteya
    Альтернативное решение.
    Суть в том, чтобы в Ranked посчитать количество предшествующих нулей. Это число и образует группы. Следующим шагом (D_Rank) присваиваем ранг каждой группе.
    Должно работать независимо от наличия или отсутствия лидирующих строк с нулями:
    WITH Ranked AS (
        -- Создание ранжированной таблицы с группами
        SELECT
            id,
            num,
            CASE
                WHEN num = 0 THEN 0
                ELSE SUM(CASE WHEN num = 0 THEN 1 ELSE 0 END) OVER (ORDER BY id) + 1 --добавляем + 1, чтобы в случаях если нет первой строки с нулевым значением скрипт корректно работал. Иначе присваивается группа 0 и некорректно обрабатывается следующим блоком.
            END as grp
        FROM
            t -- имя вашей таблицы
    )
    , D_Rank AS (
        -- Присвоение ранга для каждой группы, исключая группу 0
        SELECT
            id,
            num,
            grp,
            DENSE_RANK() OVER (ORDER BY grp) as gr
        FROM Ranked
        WHERE grp <> 0
    )
    
    -- Основной запрос, объединяющий таблицу 't' с ранжированной таблицей 'D_Rank'
    SELECT
        t.id,
        t.num,
        ISNULL(D_Rank.gr, 0) as group -- Замена NULL на 0 для группы
    FROM
        t -- имя вашей таблицы
    LEFT JOIN D_Rank ON
        t.id = D_Rank.id 
    ORDER BY
        t.id;
    Ответ написан
    Комментировать
  • Как с помощью оконных функций преобразовать таблицу?

    @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 данные, вы получите нарушение уникальности.
    В целом смысл манипуляций мне не понятен.
    Ответ написан
    Комментировать
  • Перенос данных блоками Excel из строчного вида в столбик?

    @Olteya
    Если взялись переделывать, предложу подумать над сменой структуры.
    Сделать простую таблицу со столбцами:
    Год, Месяц, Статья прихода/расхода (это ваши Пенсия/ЕДВ/Продукты и т.д.), Тип (Приход/Расход) (либо просто указывать операции расхода с минусом).
    Имея данные в таком виде ими можно управлять. Фильтровать, сортировать, считать суммы за месяц/год, строить графики.
    Если захочется добавить новую статью расхода- это не сломает таблицу. Одним словом данные будут более гибкие и управляемые.
    Ответ написан
    Комментировать
  • Как найти общие поля в таблицах?

    @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 где видно количество совпадений.
    Результат, конечно, не означает, что по этим полям можно соединять таблицы. Это могут быть ссылки на таблицу С, например. Или совпадающие даты. Дальше нужно анализировать.
    Если правильно понимаю, у автора таблицы с большим количеством столбцов без описания. Так можно хотя бы сузить диапазон поиска.
    Ответ написан
    Комментировать