• Активность сим,что видят по моему номеру?

    @x_shader
    Oracle & Coffee
    Как мы делали в похожей ситуации.

    БК покупает такой сервис от оператора.
    Под капотом может быть очень много критериев. Например: дата активации, сумма трат в месяц, регулярность пополнений, профиль пользования (больше входящих/исходящих, больше месенджеров, серфинга, видео, соцсетей и тп), количество звонков, трафика, бывает ли в роуминге и ещё 100500 других.

    БК вначале даёт оператору список номеров хороших и плохих клиентов. Оператор на базе списков и параметров выше обучает ML модель.
    Затем, когда в БК приходит новый клиент, они передают оператору номер, а тот возвращает некий ответ модели - надёжность=0.75, к примеру.

    Т.е. в этом случае никто тебе не объяснит, как прогревать. Просто твой профиль использования должен быть похож на профили других абонентов, которые раньше понравились БК.
    Но есть и случаи попроще. Оператор просто продает инфу вроде "номеру больше трёх месяцев, или нет".
    Ответ написан
    1 комментарий
  • Как корректно разбить строку на подстроки по разделителю на множестве строк (по датасету)?

    @x_shader
    Oracle & Coffee
    Привет.
    Нужно вовремя остановить connect by.

    SELECT
           t1.code
          ,regexp_substr(t1.str, '[^\|]+', 1, lvl) AS str_splitted
      FROM test t1
     CROSS JOIN LATERAL (
           SELECT level AS lvl
             FROM dual
          CONNECT BY level <= regexp_count(t1.str, '\|') 
     ) t2
    Ответ написан
    7 комментариев
  • Есть ли ошибка в задании?

    @x_shader
    Oracle & Coffee
    Может. Смотрите Self-Referential Integrity Constraints.
    Ответ написан
    Комментировать
  • Как спарсить или импортировать СМС от банков РФ в ПО по финучету?

    @x_shader
    Oracle & Coffee
    Делал примитивную пересылку всех смс в Телеграм. Сим-карта при этом воткнута в модем.
    Посмотрите Gammu smsd daemon.
    Мои записки на память и скрипты в гитлабе.

    P.S. но если есть возможность дергать API - этот вариант выглядит надёжнее.
    Ответ написан
    Комментировать
  • Как в цикле пройтись по значению поля в столбце таблицы?

    @x_shader
    Oracle & Coffee
    Идея примерно такая:
    for your_cursor in (select naprav_id, naprav_name from naprav)
    loop
      dbms_output.put_line('ID: '||your_cursor.naprav_id);
      dbms_output.put_line('Name: '||your_cursor.naprav_name);
    
      insert into some_other_table(name)
      values(your_cursor.naprav_name);
    
      -- и всякие другие варианты обращения к значению поля через your_cursor.имя_поля
    end loop;
    commit;
    Ответ написан
    Комментировать
  • Как выбрать последнюю запись по имени и дате?

    @x_shader
    Oracle & Coffee
    SELECT *
    FROM
      (SELECT id,
              name,
              salary,
              period-start,
              period-end,
              row_number() OVER (PARTITION BY name ORDER BY id DESC) AS rn
       FROM your_table
       WHERE period-start = ...
         AND period-end = ...)
    WHERE rn = 1

    Только вместо * надо перечислить нужные поля в реальном запросе.
    Ответ написан
    Комментировать
  • Как обновлять данные в хранилище?

    @x_shader
    Oracle & Coffee
    Ответ написан
    Комментировать
  • Как скрыть от провайдера факт того что я пользуюсь интернетом?

    @x_shader
    Oracle & Coffee
    Прицепить магнит на счетчик
    Ответ написан
    Комментировать
  • Хитрая SQL группировка, как сделать?

    @x_shader
    Oracle & Coffee
    MySQL 8+
    Идея такая (в порядке, обратном глубине вложенности):

    1) Пронумеровать строки непрерывной последовательностью, отсортировав по id
    2) Вывести для каждой строки остаток от деления номера строки на 2
    3) Вывести для каждой строки сумму по столбцу остатка от деления нарастающим итогом (sum(mod_column) over (order by row_number))
    4) Сгруппировать по полю этой суммы
    Ответ написан
    Комментировать
  • Нужна ли связующая таблица?

    @x_shader
    Oracle & Coffee
    Связующая таблица нужна для связи многие ко многим. У одной книги может быть несколько авторов.
    Ответ написан
    Комментировать
  • Как правильно составить запрос к базе?

    @x_shader
    Oracle & Coffee
    Раз тег не ORM, то можете погонять на своих тестовых данных SQL.
    Подставьте ваш $date вместо timestamp '2019-06-27 11:15:00'

    /*
    with channel_program as (
      select 1 as channel_id, 1 as program_id, timestamp '2019-06-27 09:00:00' as start_time, timestamp '2019-06-27 10:00:00' as end_time union all
      select 1 as channel_id, 2 as program_id, timestamp '2019-06-27 10:02:00' as start_time, timestamp '2019-06-27 11:00:00' as end_time union all
      select 1 as channel_id, 3 as program_id, timestamp '2019-06-27 11:10:00' as start_time, timestamp '2019-06-27 11:30:00' as end_time union all
      select 1 as channel_id, 4 as program_id, timestamp '2019-06-27 11:35:00' as start_time, timestamp '2019-06-27 12:00:00' as end_time union all
      select 1 as channel_id, 4 as program_id, timestamp '2019-06-27 12:00:00' as start_time, timestamp '2019-06-27 12:30:00' as end_time
    )
    */
    
    select t.program_id
      from (
            select 
                   program_id
                  ,lag(start_time) over (order by start_time) lag_start_time
                  ,lead(end_time) over (order by start_time) lead_end_time
              from channel_program
           ) t
     where timestamp '2019-06-27 11:15:00' between coalesce(t.lag_start_time, timestamp '1991-01-01 00:00:00') 
                                               and coalesce(t.lead_end_time, timestamp '2999-01-01 00:00:00')
    Ответ написан
    Комментировать
  • SQL как связать 2 таблицы varchar + number?

    @x_shader
    Oracle & Coffee
    with great_design_tab as (
      select 700 as id, '1,11,32,531' as ass_pain from dual union all
      select 701 as id, '2, 44, 321' as ass_pain from dual
    )
    ,usrs as (
      select 1 as id, 'вася' as username from dual union all
      select 11 as id, 'петя' as username from dual union all
      select 32 as id, 'костя' as username from dual union all
      select 531 as id, 'дима' as username from dual union all
      select 2 as id, 'жора' as username from dual union all
      select 44 as id, 'изя' as username from dual union all
      select 321 as id, 'семен' as username from dual
    )
    select u.id, u.username, t.id
      from usrs u
          ,great_design_tab t
          ,lateral (
                    select level x from dual 
                    connect by regexp_substr(ass_pain, '[^,]+', 1, level) is not null
                   )
     where u.id = trim(regexp_substr(ass_pain,'[^,]+', 1, x));


    ID USERNAME         ID
    ---------- -------- ----------
             1 вася            700
            11 петя            700
            32 костя           700
           531 дима            700
             2 жора            701
            44 изя             701
           321 семен           701
    Ответ написан
    Комментировать
  • Как правильно составить таблицу фактов и таблицы измерений?

    @x_shader
    Oracle & Coffee
    -- Уровень источников --
    Таблицы в том виде, в котором уни уже есть в БД источниках.

    -- Детальный уровень (нормализованные данные, снежинка) --
    Фактом у вас может быть некое событие с достаточным для ешго идентификации набором сведений - (Дата выплаты, Сумма выплаты, Ид сотрудника).
    Все остальное - измерения. Пол, дата_рождения, нанят_дата - атрибуты измерения Сотрудник. Все даты действия (от, до) хранятся в таблицах измерений и определяют состояние атрибутов конкретной записи для выборки на дату совершения какого-то факта или на дату отчета.

    -- Уровень OLAP кубов (денормализованная таблица, храним только ид) --
    Здесь вы, на основании своего детального уровня (фактов и измерениий), собираете куб.
    (ДатаГод, ДатаМесяц, СуммаВыплаты, Ид_сотрудника, Ид_отдела, Ид_должности, ... )

    Это пример варианта. Могут быть варианты без детального уровня. с заливкой из источников прямо в куб. Да и еще много какие варианты.
    Ответ написан
    1 комментарий
  • Проблема с датой в node.js и Oracle?

    @x_shader
    Oracle & Coffee
    TO_DATE(:dt, 'DD.MM.YYYY HH24:MI:SS')

    И пробел в значении перед 31 лишний: // d = '31.01.2019 17:20:31'
    Ответ написан
    2 комментария
  • Как заполнить пустые строки предыдущим значением (lag + left join)?

    @x_shader
    Oracle & Coffee
    Заготовка без инлайн подзапросов выглядит примерно как в коде ниже. Запрос к таблице с данными здесь один.
    Но надо дорабатывать напильником, чтоб цеплять первый остаток по счету, который не вошел в отчетный период.
    (напр., юнионом доклеить одну строку в самый нижний подзапрос)

    WITH dt_range AS (
      SELECT TRUNC (&dt_start + ROWNUM - 1) dt
        FROM DUAL CONNECT BY ROWNUM <= &dt_end - &dt_start + 1
    )
    ,bal AS (
      SELECT 101 id_, to_date('20171130', 'yyyymmdd') date_, 50 sum_ FROM DUAL UNION ALL
      SELECT 101, to_date('20180102', 'yyyymmdd'), 300 FROM DUAL UNION ALL
      SELECT 101, to_date('20180105', 'yyyymmdd'), 500 FROM DUAL UNION ALL
      SELECT 101, to_date('20180107', 'yyyymmdd'), 700 FROM DUAL 
    )
    
    
    SELECT id_ --MAX(id_) OVER (PARTITION BY grp) id_
          ,dt
          ,MAX(sum_) OVER (PARTITION BY grp) sum_
      FROM (
            SELECT t1.*
                  ,SUM(start_of_group) OVER(ORDER BY t1.dt) grp
               FROM (
                      SELECT bal.id_
                            ,dt_range.dt
                            ,bal.sum_
                            ,CASE WHEN bal.sum_ IS NOT NULL THEN 1 END start_of_group
                      FROM dt_range
                      LEFT JOIN bal ON dt_range.dt = bal.date_
                    ) t1
            )
       ORDER BY dt
    Ответ написан
    Комментировать
  • Как получить таблицу из двух таблиц с почти одинаковыми столбцами?

    @x_shader
    Oracle & Coffee
    select
     c.id
    ,c.name
    ,sum(case p.sex when 'м' then 1 else 0 end) as male_count
    ,sum(case p.sex when 'ж' then 1 else 0 end) as female_count
    from category c
    left join product p on p.category_id = c.id
    group by c.id, c.name
    order by c.id
    Ответ написан
    Комментировать
  • Как ускорить запрос с DISTINCT в PostgreSQL?

    @x_shader
    Oracle & Coffee
    Должно помочь избавление от конкатенации.

    SELECT DISTINCT CITY, AREA, REGION FROM youtube
    или
    SELECT CITY,  AREA, REGION
    FROM youtube
    GROUP BY CITY,  AREA, REGION


    Если сильно нужно получать именно конкатенированный результат, то подзапрос все-равно будет быстрее
    SELECT  "CITY" || ' | '  || "AREA" || ' | ' || "REGION" FROM (
        SELECT CITY,  AREA, REGION
        FROM youtube
        GROUP BY CITY,  AREA, REGION) t
    Ответ написан
    9 комментариев
  • Какую архитектуру базы лучше использовать в данном случае?

    @x_shader
    Oracle & Coffee
    У вас сейчас подходящая структура для хранения. Если стоит задача находить магазин с минимальной ценой по товару, то ваша структура будет прекрасно справляться.
    Но "быстро и эффективно можно было построить список для сравнения цен" - это не то же самое, что городить таблицу на 500 столбцов, которой невозможно пользоваться на практике. Результат для просмотра человеком, как правило, должен быть более агрегирован.
    Ответ написан
    1 комментарий
  • Как создать отчёт в MS SQL SERVER?

    @x_shader
    Oracle & Coffee
    Зависит от того,
    - что уже есть в инфраструктуре? Если есть какой-нибудь репортинг, мониторинг, рассылки - лучше на чем-то из этого поднять.
    - что хочется изучать? Если вдруг поковырять БД, то у MS есть Database Mail + sp_send_dbmail.

    Можешь вообще свой SELECT подключить как источник данных для Excel и пусть менеджер раз в месяц этот Excel файл открывает и рефрешит.
    Ответ написан
    Комментировать