문제

다음과 같이 만든 테이블 'Orders'가 있다고 가정 해 봅시다.

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

타임 스탬프는 유닉스 타임 스탬프입니다. 이제 모든 고객에 대한 최신 주문의 ID를 선택하고 싶습니다. 보기가 좋을 것입니다.

그러나 다음 진술

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

GRE POSTRER 오류를 일으 킵니다.

오류 : 열 "orders.id"열은 절에 의해 그룹에 표시되거나 집계 함수에 사용되어야합니다.

내가 뭘 잘못하고 있죠?

도움이 되었습니까?

해결책

이러한 종류의 경우 두 가지 접근 방식을 사용할 수 있습니다. 하나는 이미 Jens에 의해 보여졌습니다.

다른 것은 "구별"절을 사용하는 것입니다.

CREATE VIEW lastOrders AS
SELECT
DISTINCT ON (customerID)
    id,
    customerID,
    timestamp
FROM orders
ORDER BY customerID, timestamp desc;

다른 팁

다음 쿼리는 각 고객의 마지막 주문 만 반환해야합니다.

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
        );

(동일한 타임 스탬프 값을 가진 고객에 대해 두 개의 주문을 할 수 없다고 가정합니다.)

편집 : Postgres 's DISTINCT ON 이 작업을 수행하는 훨씬 더 멋진 방법입니다. 나는 그것에 대해 배운 것이 기쁘다. 그러나 위의 것은 다른 RDBMS에 작용합니다.

Kquinns 답변은 예외를 해결하지만 찾고있는 것은 아닙니다.

MySQL의 기능을 모르지만 이와 같은 것이 Oracle과 함께 작동합니다.

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에서 사용할 수 있다고 생각하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top