Size: a a a

pgsql – PostgreSQL

2021 January 29

M

Milkhael in pgsql – PostgreSQL
John Smith
Добрый день
Есть вот такой запрос, он делает ровно то что нужно, но неправильно отрабатывается один единственный кейс. Мне нужно, чтобы запрос возвращал результат в том случае, если в splitted_intervals всего одна строка. Не могу сообразить, как это сделать.

      SELECT
       a.available_interval_left_part AS available_intervals
       FROM splitted_intervals a
       LEFT OUTER JOIN splitted_intervals b ON
         a.available_interval_left_part <> b.available_interval_left_part AND
         a.available_interval_left_part @> b.available_interval_left_part
       GROUP BY a.available_interval_left_part
       HAVING NOT bool_or(
         COALESCE(
           a.available_interval_left_part @>
           CASE
             WHEN
               isempty( b.available_interval_left_part )
             THEN
               null
             ELSE
               b.available_interval_left_part
           END, false ) )
Я, честно говоря, пока не понимаю логику запроса. У вас там везде только available_interval_left_part фигурирует. И в having условие кажется немного бессмысленным.
источник

M

Milkhael in pgsql – PostgreSQL
John Smith
Добрый день
Есть вот такой запрос, он делает ровно то что нужно, но неправильно отрабатывается один единственный кейс. Мне нужно, чтобы запрос возвращал результат в том случае, если в splitted_intervals всего одна строка. Не могу сообразить, как это сделать.

      SELECT
       a.available_interval_left_part AS available_intervals
       FROM splitted_intervals a
       LEFT OUTER JOIN splitted_intervals b ON
         a.available_interval_left_part <> b.available_interval_left_part AND
         a.available_interval_left_part @> b.available_interval_left_part
       GROUP BY a.available_interval_left_part
       HAVING NOT bool_or(
         COALESCE(
           a.available_interval_left_part @>
           CASE
             WHEN
               isempty( b.available_interval_left_part )
             THEN
               null
             ELSE
               b.available_interval_left_part
           END, false ) )
и, кстати, с одной строкой результат возвращается
источник

JS

John Smith in pgsql – PostgreSQL
Milkhael
Я, честно говоря, пока не понимаю логику запроса. У вас там везде только available_interval_left_part фигурирует. И в having условие кажется немного бессмысленным.
Потому что это лишь часть запроса из 180 строк. Попробую описать по-другому
SELECT a.*
FROM table a,
LEFT OUTER JOIN table b ON ...

Надо избавиться от джойна если там одна строка
источник

M

Milkhael in pgsql – PostgreSQL
John Smith
Потому что это лишь часть запроса из 180 строк. Попробую описать по-другому
SELECT a.*
FROM table a,
LEFT OUTER JOIN table b ON ...

Надо избавиться от джойна если там одна строка
Вот тот запрос он что должен возвращать, если человеческим языком? Сейчас он возвращает непустые avavilable_interval_left_part которые не содержат вложенных непустых avavilable_interval_left_part в той же таблице. Это как-то не совпадает с вашим сообщением от 12:38.
источник

JS

John Smith in pgsql – PostgreSQL
Milkhael
Я, честно говоря, пока не понимаю логику запроса. У вас там везде только available_interval_left_part фигурирует. И в having условие кажется немного бессмысленным.
Там логика такая, что возвращаются интервалы:
8:00-13:00
8:00-12:00
14:00-17:00
14:00-16:00
Логика такая, что если есть пересекающиеся интервалы (например, 8:00-13:00 и 8:00-14:00, то возвращается наименьший из них).
Сделано по мотивам этой статьи, но там есть ошибка, я доработал
https://info.crunchydata.com/blog/range-types-recursion-how-to-search-availability-with-postgresql
источник

M

Milkhael in pgsql – PostgreSQL
John Smith
Там логика такая, что возвращаются интервалы:
8:00-13:00
8:00-12:00
14:00-17:00
14:00-16:00
Логика такая, что если есть пересекающиеся интервалы (например, 8:00-13:00 и 8:00-14:00, то возвращается наименьший из них).
Сделано по мотивам этой статьи, но там есть ошибка, я доработал
https://info.crunchydata.com/blog/range-types-recursion-how-to-search-availability-with-postgresql
За ссылку спасибо, почитаю. Но я теперь ещё больше запутался. Вы пишите про пересечение, а в запросе у вас используется вложенность
источник

JS

John Smith in pgsql – PostgreSQL
Milkhael
За ссылку спасибо, почитаю. Но я теперь ещё больше запутался. Вы пишите про пересечение, а в запросе у вас используется вложенность
Я, возможно, неверно выразился. Давайте сформулирую так, что возвращается интервал, в который ничего не вложено. По статье всё поймете, если интересно
источник

R

Revival in pgsql – PostgreSQL
Victor Yegorov
странная схема, я бы не использовал в этом случае чисто id как название колонки.
предположу, что inventory_items.id == items.id. однако! тот факт, что:
- items ссылается на inventory_items
- items не имеет явного FK на inventory_items (кроме предполагаемого id)
делает эту таблицу избыточной.

тут надо пересматривать дизайн.
на скрине отсутствует inventoryToItem таблица :(
но я не понимаю другого простого момента, count мне нужно хранить в новой таблице вместе с нужным item или же можно хранить прямо в Item и каким-то образом кастомизировать для каждого юзера?
источник

M

Milkhael in pgsql – PostgreSQL
Ну а всё-таки, почему вы говорите, что с одной строкой не работает? Вот так попробуйте:
with splitted_intervals as (
 select tsrange('2020-01-29 08:00', '2020-01-29 19:00') as available_interval_left_part
)
SELECT a.available_interval_left_part AS available_intervals
 FROM splitted_intervals a
 LEFT JOIN splitted_intervals b
        ON a.available_interval_left_part <> b.available_interval_left_part
       AND a.available_interval_left_part @> b.available_interval_left_part
GROUP BY a.available_interval_left_part
HAVING NOT bool_or(COALESCE(a.available_interval_left_part
                           @>
                           CASE
                             WHEN isempty(b.available_interval_left_part)
                               THEN
                                 null
                             ELSE
                               b.available_interval_left_part
                           END, false));

Работает же
источник

VY

Victor Yegorov in pgsql – PostgreSQL
Revival
на скрине отсутствует inventoryToItem таблица :(
но я не понимаю другого простого момента, count мне нужно хранить в новой таблице вместе с нужным item или же можно хранить прямо в Item и каким-то образом кастомизировать для каждого юзера?
я не могу ответить. я не понимаю зачем нужна “новая” таблица о которой вы говорите и какой смысл у count (название колонки крайне неудачное!)
источник

РЖ

Роман Жарков... in pgsql – PostgreSQL
Надо чтобы робот на фразу в духе "я новичок" отвечал новой капчей. Что-нибудь из SQL.
источник

4

4g in pgsql – PostgreSQL
Или отсылкой в документацию )
источник

DD

Dmytro Dzubenko in pgsql – PostgreSQL
Добрый день! Подскажите утилитку для конвертации ddl и индексов в html. Где-то в дайджесте была, не могу нагуглить.
источник

ГА

Георгий Ава... in pgsql – PostgreSQL
может ли при запросе вида select * from table where col_1 = 5 and col_2 between '2020-01-01' and '2020-01-03'   и двух индексах по каждому полю
источник

ГА

Георгий Ава... in pgsql – PostgreSQL
использоваться оба индекса
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Георгий Ава
использоваться оба индекса
В принципе да.
источник

ГА

Георгий Ава... in pgsql – PostgreSQL
Yaroslav Schekin
В принципе да.
Т.е. если у меня есть индекс по одному из поле можно просто создать индекс по второму.
А не создавать индекс по двум полям.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Георгий Ава
Т.е. если у меня есть индекс по одному из поле можно просто создать индекс по второму.
А не создавать индекс по двум полям.
"В принципе". Правильный индекс по двум, скорее всего, гораздо лучше.
Т.е. PostgreSQL будет использовать два в некоторых случаях, потому что на безрыбье и рак рыба.
источник

ГА

Георгий Ава... in pgsql – PostgreSQL
Yaroslav Schekin
"В принципе". Правильный индекс по двум, скорее всего, гораздо лучше.
Т.е. PostgreSQL будет использовать два в некоторых случаях, потому что на безрыбье и рак рыба.
Просто сколько смотрел планы, получалось, что одно условие отбиралось по индексу, а второе отфильтровывалос.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Георгий Ава
Просто сколько смотрел планы, получалось, что одно условие отбиралось по индексу, а второе отфильтровывалос.
Возможно, были неправильно составлены запросы, либо индекс был неподходящим.
Т.е. нужно смотреть запросы, планы и \d таблиц.
источник