групповой вопрос в postgresql - PullRequest
4 голосов
/ 24 марта 2009

Скажем, у меня есть таблица 'заказов', созданная как:

CREATE TABLE orders (id SERIAL, 
                     customerID INTEGER,
                     timestamp BIGINT, 
                     PRIMARY KEY(id));

Отметка времени является отметкой времени UNIX. Теперь я хочу выбрать идентификаторы последних заказов для каждого клиента. В качестве представления было бы неплохо.

однако следующее утверждение

CREATE VIEW lastOrders AS SELECT  id,
                                  customerID, 
                                  MAX(timestamp) 
                                  FROM orders 
                                  GROUP BY customerID;

Вызывает ошибку postgre:

ОШИБКА: в GROUP BY должен появиться столбец "orders.id" предложение или использоваться в статистической функции

Что я делаю не так?

Ответы [ 3 ]

12 голосов
/ 24 марта 2009

Для такого рода вещей вы можете использовать 2 подхода. Один из них уже показан Йенсом.

Другое - использовать предложение "DISTINCT ON":

CREATE VIEW lastOrders AS
SELECT
DISTINCT ON (customerID)
    id,
    customerID,
    timestamp
FROM orders
ORDER BY customerID, timestamp desc;
2 голосов
/ 24 марта 2009

Следующий запрос должен возвращать только самый последний заказ для каждого клиента.

CREATE  VIEW last_orders AS
SELECT  id, customer_id, timestamp
FROM    orders AS o
WHERE   timestamp = (
            SELECT  MAX(timestamp)
            FROM    orders AS oi
            WHERE   o.customer_id = oi.customer_id
        );

(при условии, что у вас не может быть двух заказов для клиента с одинаковым значением метки времени.)

Edit: Postgres DISTINCT ON - гораздо более изящный способ сделать это. Я рад, что узнал об этом. Но вышесказанное работает для других СУБД.

0 голосов
/ 24 марта 2009

Ответ kquinns исправит исключение, но это не то, что вы ищете.

Я не знаю особенностей mysql, но что-то вроде этого будет работать с оракулом:

select a.*
from 
    orders a, 
    (select customerID, max(timestamp) timestamp 
        from orders group by customerID
    ) b
where a.customer_id = b.customerID
and a.timestamp = b.timestamp

На самом деле с Oracle можно использовать аналитические функции, но я не думаю, что они доступны в MySQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...