I have three tables: Customer, CustomerOrder, and OrderStatus.
My database is filled with the following info:
Customer
| id | name |
|---|---|
| 1 | Bob |
| 2 | James |
CustomerOrder
| id | customer | amount | status |
|---|---|---|---|
| 1 | 1 | 100 | 1 |
| 2 | 1 | 83 | 1 |
| 3 | 1 | 432 | 2 |
| 4 | 2 | 58 | 3 |
| 5 | 2 | 33 | 2 |
| 6 | 3 | 10 | 1 |
OrderStatus
| id | description |
|---|---|
| 1 | pending |
| 2 | completed |
| 3 | cancelled |
I need help writing a SQL query which shows the status of the latest order (highest order id), per customer. Running the query on the data would produce the following result:
| customer | latest_order_status |
|---|---|
| 1 | 2 |
| 2 | 2 |
| 3 | 1 |
CodePudding user response:
Use max(CustomerOrder.Id) in combination with group by CustomerOrder.Customer to get highest OrderId per Customer.
CodePudding user response:
you can also use the windowing functions to order your orders by the customer in a descending order. The Row_number() function will assign the number 1 to the latest order.
SELECT *, ROW_NUMBER() over ( partition by customer_id order by id desc) as row_no FROM
to have only the latest data you can nest this query like so:
SELECT
*
FROM (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY id DESC) AS row_no
FROM
orders )
WHERE
row_no = 1
Here some more reading: postgreSQL row_number() function
