4.5. Синтаксис #

4.5.1. Создание таблицы Postgres Pro #

Пример 4.47.

-- Стандартная таблица Postgres Pro
CREATE TABLE orders (
  order_id SERIAL PRIMARY KEY,
  product_name TEXT,
  amount NUMERIC,
  order_date DATE
);

INSERT INTO orders (product_name, amount, order_date)
VALUES ('Laptop', 1200.00, '2024-07-01'),
      ('Keyboard', 75.50, '2024-07-01'),
      ('Mouse', 25.00, '2024-07-02');

4.5.2. Запросы к таблицам Postgres Pro #

Для аналитических запросов к существующим таблицам Postgres Pro используйте стандартный SQL. Специальный синтаксис не требуется. pgpro_axe автоматически ускоряет выполнение этих запросов, если вы указываете true для duckdb.force_execution.

Пример 4.48.

SET duckdb.force_execution = true;
-- Стандартный SELECT к таблице Postgres Pro
SELECT
  category,
  AVG(price) as avg_price,
  COUNT(*) as item_count
FROM
  products -- Обычная таблица Postgres Pro
GROUP BY
  category
ORDER BY
  avg_price DESC;

SET duckdb.force_execution = true;
-- Стандартный SELECT к таблице Postgres Pro
SELECT
  category,
  AVG(price) as avg_price,
  COUNT(*) as item_count
FROM
  products -- Обычная таблица Postgres Pro
GROUP BY
  category
ORDER BY
  avg_price DESC;

4.5.3. Запросы к внешним файлам #

Чтобы выполнять запросы к файлам из озера данных (например, из локального или S3-хранилища), используйте функции read_*.

Чтобы получить доступ к столбцам, используйте синтаксис r['имя_столбца'].

Пример 4.49.

-- Выполнить запрос к одному Parquet-файлу
SELECT
  r['product_id'],
  r['review_text']
FROM
  read_parquet('s3://my-bucket/reviews.parquet') r -- 'r' is a required alias
LIMIT 100;

-- Выполнить запрос к нескольким CSV-файлам, используя glob-шаблон
SELECT
  r['timestamp'],
  r['event_type'],
  COUNT(*) as event_count
FROM
  read_csv('s3://my-datalake/logs/2024-*.csv') r
GROUP BY
  r['timestamp'],
  r['event_type'];

4.5.4. Соединение данных Postgres Pro с внешними данными #

В одном запросе можно соединять таблицы Postgres Pro с внешними источниками данных.

Пример 4.50.

-- Соединить локальную таблицу Postgres Pro 'customers' с удалённым Parquet-файлом 'orders'
SELECT
  c.customer_name,
  c.signup_date,
  SUM(r['order_total']) AS total_spent
FROM
  customers c -- This is a Postgres Pro table
JOIN
  read_parquet('s3://my-bucket/orders/*.parquet') r ON c.customer_id = r['customer_id']
WHERE
  c.status = 'active'
GROUP BY
  c.customer_name,
  c.signup_date
ORDER BY
  total_spent DESC;

4.5.5. Использование duckdb.query() #

duckdb.query() — это расширенная функция, которая не требуется для большинства запросов. Используйте её только в тех случаях, когда необходимо выполнить запрос, использующий специфичный для DuckDB синтаксис, который недопустим в Postgres Pro.

Пример 4.51.

-- Этот запрос использует синтаксис оператора PIVOT из DuckDB, поэтому его необходимо обернуть в duckdb.query()
SELECT * FROM duckdb.query($$
  PIVOT sales_summary
  ON product_category
  USING SUM(total_sales)
  GROUP BY region;
$$);