Ответы пользователя по тегу PostgreSQL
  • Как вывести метки в радиусе 10 метров от меня?

    LaRN
    @LaRN
    Senior Developer
    Может воспользоваться формулами на подобии тех что описаны тут:
    https://mapgroup.com.ua/glavnaya/astronomicheskie-...

    По идее если у вас небольшой разброс точек по расстоянию, то формулы можно упростить. Т.е. условно можно вычислить координаты краевых значений квадрата в который должны входить точки и далее сделать селект по этим координатам из таблицы.
    Ответ написан
    Комментировать
  • Не работает удаление записей из БД. Spring boot. В чем проблема?

    LaRN
    @LaRN
    Senior Developer
    Возможно причина в том, что нужно использовать метод deleteById, который уже есть в CrudRepository.
    https://docs.spring.io/spring-data/commons/docs/cu...
    Ответ написан
    Комментировать
  • Как хранить в базе исторические данные и удалять дубликаты?

    LaRN
    @LaRN
    Senior Developer
    Можно для каждого датчика в оперативной таблице хранить две даты: дата начала интервала постоянства и дата окончания этого интервала. Это такой интервал в котором значение датчика не меняется.
    Т. е. грузим текущие данные и если по датчику значение не поменялось, то просто изменяем дату окончания интервала на дату текущей загрузки, если значение датчика поменялось(отличается от сохраненного в оперативной таблице) , то текущий интервал выгружаем в архивную таблицу, а в оперативной добавляем новую(изменяем существующую) запись для датчика у которой дата начала и дата окончания будет равна дате текущей загрузки, а значение текущему загружаемому значению датчика.
    Т. е. в оперативной таблице всегда количество записей равно количеству датчиков, а в исторической весь скоп предыдущих значений.
    Это должно защитить от того, что с течением времени скорость работы с оперативной таблицей будет деградировать, от того что там будет расти число записей.
    Если же нужно какой-то отчёт строить или выгрузку за период или за прошлые даты, то тут уже нужно будет работать с исторической таблицей и это будет уже не очень быстро, но такие операции обычно не требуется часто выполнять.

    Так как данные грузятся раз в 3-4 дня, наверное не очень критично, что загрузка будет выполнять не мгновенно. Тут наверное проще в несколько этапов сделать: на первом проходе построить список идентификатор датчиков по которым значение не поменялось, затем по этому списку проапдейтить дату окончания интервала на дату текущей загрузки, затем по датчикам которые не попали в список перелить строки в архивную таблицу и наконец поменять для изменённый датчиков в оперативной таблице значение счётчика и даты начала и окончания интервала.
    Всё шаги можно делать массово.
    Ответ написан
    Комментировать
  • PostgreSQL выдаёт ошибку, будто не знает обобщённое выражение. Что не так?

    LaRN
    @LaRN
    Senior Developer
    Может быстрее будет вместо delete написать:
    SELECT * FROM D
    WHERE numbering > 1;
    И сохранить результат select во временную таблицу.
    После этого грохнуть все эти строки и вставить уже по одному экземпляру каждой из временной таблицы.
    Ответ написан
    Комментировать
  • Как сруппировать частично совпадающие значения в SQL?

    LaRN
    @LaRN
    Senior Developer
    Можно было бы добавить ещё одну таблицу групп с полями x и group. Заджойнить вашу table с новой таблицей по полю x и сгруппировать по полю group. В вашем варианте в какой-то момент case может стать очень сложным и не читаемым, адля добавления новой группы нужно всегда запрос дописывать, а это не гуд.
    Ответ написан
  • Сортировка по связующей таблице?

    LaRN
    @LaRN
    Senior Developer
    А почему через join не вышло?
    Можно так попробовать:

    SELECT companies.name, max(polls.created_at)
      FROM polls
      JOIN teams
        ON teams.id = polls.team_id
      JOIN companies
        ON companies.id = teams.company_id
     GROUP BY companies.name
     ORDER BY 2
    Ответ написан
  • Как update table через массив?

    LaRN
    @LaRN
    Senior Developer
    Чтобы проапдейти таблицу, нужно каждую строку изменяемой таблицы как-то связать с массивом (чтобы связь была один к одному), т.е. в массиве условно д.б. ключевое поле (а массив д.б. двухмерным), которое вы укажите в запросе на апдейт.

    Подробнее тут:
    https://postgrespro.ru/docs/postgrespro/9.5/querie...
    Ответ написан
    Комментировать
  • Как правильно организовать конкурентный доступ с данным?

    LaRN
    @LaRN
    Senior Developer
    Мы аналогичную задачу решали так:
    Создали таблицу в которую заноситься объект при подъеме его на редактирование. Все остальные пользователи при попытке редактировать этот объект, получают сообщение, что пользователь "такой-то" его уже редактирует и форма поднимается в режиме только для чтения.
    Когда первый пользователь закрывает форму с объектом, из таблицы удаляется запись и объект сможет редактировать другой пользователь.

    Иногда случались сбои (например дисконнект) и пользователь открывший объект на редактирование не мог корректно освободить редактируемый объект. В этом случае, если объект есть в таблице редактируемых, но процесс с его spid и именем пользователя отсутствует на SQL сервере , принудительно удаляем объект из таблицы редактируемых.

    Без такого механизма периодически забивали несоответствия вида: "я поменял объект, сохранил, поднял его на просмотр, а он другой".
    Ответ написан
    1 комментарий
  • Двойной SELECT вместе с UNION и возвратом наибольшего значения, как?

    LaRN
    @LaRN
    Senior Developer
    Можно через временны запрос попробовать:
    WITH rates as
    (SELECT rate, type, route_id, weight, volume
       FROM test_rates rs
      WHERE rs.dt_del IS NULL
        AND (rs.volume >= 300 OR rs.weight >= 50000))
    SELECT rate, type, route_id, weight, volume
      FROM rates
     where rate = (select max(rate) from rates)
    Ответ написан
    Комментировать
  • Почему появляется ошибка "column must appear in the GROUP BY clause or be used in an aggregate function"?

    LaRN
    @LaRN
    Senior Developer
    Поле по которому происходит группировка image_url, поле которое агрегируется votes.value, а поле views ни там, ни там.
    Нужно добавить поле views в секцию group by:
    group by image_url, views , например так:
    select views, image_url, (select avg(votes.value))
      from images
     inner join votes 
         on votes.image_id = images.id
     group by views, image_url
     order by views asc


    Либо в секцию order by поставить поле image_url.
    Ответ написан
    1 комментарий
  • Как организовать БД?

    LaRN
    @LaRN
    Senior Developer
    Я бы сделал одну таблицу с промокодами и продумал какие индексы понадобятся исходя из возможных вариантов использования.
    Одну таблицу потому что сейчас у вас 4 типа, а потом их может стать больше и ради этого придется добавлять новые таблицы и переписывать запросы?
    Кроме этого много таблиц усложнит запросы, особенно там где нужно будет строит отчеты.
    Чтобы таблица не сильно разрасталась, для промокодов можно предусмотреть срок жизни и просроченные удалять или переносить в архивную таблицу.
    Ответ написан
  • Как скопировать поля с одной таблицы в другую?

    LaRN
    @LaRN
    Senior Developer
    Попроуйте такой запрос:

    UPDATE recording
    SET recording.videoId. = video.videoId
    SET recording.default = video.default
    SET recording.medium = video.medium
    SET recording.high = video.high
    FROM video
    JOIN recording
    ON recording.id = video.recordingId

    Перед запуском update можно сделать проверочный запрос, вот такой:

    Select
    recording.videoId, video.videoId
    recording.default, video.default
    recording.medium, video.medium
    recording.high, video.high
    FROM video
    JOIN recording
    ON recording.id = video.recordingId

    Запрос покажет какие записи отобрались для апдейта.

    Насчёт varchar: varchar хранит столько символов сколь реально передано, а char столько, сколько указано в описании поля.
    Ответ написан
    Комментировать