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

    i229194964
    @i229194964
    Веб разработчик
    import { Repository, EntityRepository } from 'typeorm';
    import { PaginationDto } from './pagination.dto';
    
    @EntityRepository(YourEntity)
    export class YourEntityRepository {
      constructor() {
        super(YourEntity);
      }
    
      async getAllTutors(identification_post: string, dto: PaginationDto) {
        const query = this.createQueryBuilder('yourEntityAlias'); // Замените 'yourEntityAlias' на алиас вашей сущности
    
        query.where('post_text ILIKE :keyword', { keyword: `%${identification_post}%` });
    
        const [results, total] = await query
          .take(dto.limit)
          .skip((dto.page - 1) * dto.limit)
          .getManyAndCount();
    
        return { results, total };
      }
    }
    Ответ написан
    Комментировать
  • Как посчитать количество подряд идущих одинаковых записей SQL?

    i229194964
    @i229194964
    Веб разработчик
    -- Выбираем все столбцы из вашей таблицы и добавляем два новых столбца:
    -- NewGroup - показывает, начинается ли новая группа записей
    -- GroupCount - показывает количество подряд идущих групп для каждой записи
    SELECT
      Date,
      Check,
      Time,
      Product,
      Qty,
      Price,
      -- Если предыдущая запись имеет ту же дату и чек, что и текущая, то это не новая группа
      -- В противном случае, это новая группа
      CASE
        WHEN LAG(Date) OVER (ORDER BY Date, Time, Check) = Date AND LAG(Check) OVER (ORDER BY Date, Time, Check) = Check THEN 0
        ELSE 1
      END AS NewGroup,
      -- Используем функцию SUM с условием для подсчета количества подряд идущих групп
      SUM(CASE
        WHEN LAG(Date) OVER (ORDER BY Date, Time, Check) = Date AND LAG(Check) OVER (ORDER BY Date, Time, Check) = Check THEN 0
        ELSE 1
      END) OVER (ORDER BY Date, Time, Check) AS GroupCount
    FROM
      YourTable
    ORDER BY
      Date, Time, Check

    пример запроса для получения максимального числа подряд идущих записей для каждого дня
    -- Используем подзапрос с предыдущим запросом для получения максимального числа подряд идущих групп для каждой даты
    SELECT
      Date,
      MAX(GroupCount) AS MaxGroupCount
    FROM (
      SELECT
        Date,
        Check,
        Time,
        Product,
        Qty,
        Price,
        -- Аналогично предыдущему запросу, создаем столбец NewGroup и используем функцию SUM с условием для подсчета количества подряд идущих групп
        CASE
          WHEN LAG(Date) OVER (ORDER BY Date, Time, Check) = Date AND LAG(Check) OVER (ORDER BY Date, Time, Check) = Check THEN 0
          ELSE 1
        END AS NewGroup,
        SUM(CASE
          WHEN LAG(Date) OVER (ORDER BY Date, Time, Check) = Date AND LAG(Check) OVER (ORDER BY Date, Time, Check) = Check THEN 0
          ELSE 1
        END) OVER (ORDER BY Date, Time, Check) AS GroupCount
      FROM
        YourTable
    ) t
    -- Группируем по дате и выбираем максимальное значение GroupCount для каждой даты
    GROUP BY
      Date
    Ответ написан
  • Почему в LIKE возвращает пустой результат?

    i229194964
    @i229194964
    Веб разработчик
    Данная проблема чаще всего возникает различия строк сравнения между PostgreSQL. Версия 15 может использовать другие настройки по умолчанию.
    В PostgreSQL сравнение строк зависит от настройки collation.
    Попробуйте изменить настройки collation для PostgreSQL 14, чтобы они соответствовали настройкам версии 15.
    return User::where("name", "LIKE", "%{$query}%")->collate('utf8mb4_general_ci')->get();
    Ответ написан
    2 комментария