Цель состоит в том, чтобы отобразить самую последнюю транзакцию по custmer_id - PullRequest
0 голосов
/ 14 июня 2019

Мой код ранжирует последнюю транзакцию клиента по номеру строки, как и планировалось, но я не могу отфильтровать свое объединение, чтобы отобразить последнюю транзакцию для каждого клиента.Цель состоит в том, чтобы отобразить последнюю подробную транзакцию клиента для customer_id.Я попытался использовать оконную функцию, а затем отфильтровать полученный столбец.

CREATE TABLE customer1 (
  customer_id INT PRIMARY KEY,
  first_name VARCHAR(255),
  last_name VARCHAR(255),
  email VARCHAR(255),
  created_at TIMESTAMP WITH TIME ZONE NOT NULL
);

CREATE TABLE purchase (
  purchase_id INT PRIMARY KEY,
  purchase_time TIMESTAMP WITH TIME ZONE NOT NULL,
  customer_id INT NOT NULL,
  FOREIGN KEY (customer_id) REFERENCES customer1(customer_id)
);

CREATE TABLE purchase_item (
  purchase_item_id INT PRIMARY KEY,
  purchase_id INT NOT NULL,
  sku VARCHAR(255),
  quantity INT NOT NULL,
  total_amount_paid DECIMAL(10,2) NOT NULL,
  FOREIGN KEY (purchase_id) REFERENCES purchase(purchase_id)
);

INSERT INTO customer1 (customer_id, first_name, last_name, email, created_at) VALUES
  (1, 'James', 'Smith', 'jamessmith@example.com', clock_timestamp()),
  (2, 'Mary', 'Johnson', 'maryjohnson@example.com', clock_timestamp()),
  (3, 'John', 'Williams', 'johnwilliams@example.com', clock_timestamp()),
  (4, 'Patricia', 'Brown', 'patriciabrown@example.com', clock_timestamp()),
  (5, 'Michael', 'Garcia', 'michaelgarcia@example.com', clock_timestamp());

INSERT INTO purchase (purchase_id, purchase_time, customer_id) VALUES
  (100, clock_timestamp(), 1),
  (101, clock_timestamp(), 1),
  (102, clock_timestamp(), 1),
  (103, clock_timestamp(), 2),
  (104, clock_timestamp(), 3),
  (105, clock_timestamp(), 5);

INSERT INTO purchase_item(purchase_item_id, purchase_id, sku, quantity, total_amount_paid) VALUES
  (200, 100, 'shoe_blk_42', 3, 300),
  (201, 100, 'shoe_lace_white', 3, 2.5),
  (202, 101, 'shorts', 1, 40),
  (203, 102, 'bike', 1, 1995),
  (204, 103, 'bike', 2, 3990),
  (205, 103, 'shoe_wht_39', 2, 200),
  (206, 104, 'shirt', 1, 60),
  (207, 105, 'headphones', 1, 400);


SELECT DISTINCT customer1.customer_id,
first_name,
last_name,
email,
purchase.purchase_id,
purchase.purchase_time,
purchase_item.quantity,
purchase_item.total_amount_paid,

ROW_NUMBER()OVER (
      PARTITION BY purchase.customer_id
      ORDER BY
         purchase.purchase_time DESC

) As order_queue
FROM customer1
JOIN purchase ON customer1.customer_id = purchase.customer_id
JOIN purchase_item ON purchase.purchase_id = purchase_item.purchase_id
WHERE order_queue = 1;

1 Ответ

0 голосов
/ 14 июня 2019

Вы можете использовать DISTINCT ON для решения этой проблемы:

select distinct on (customer1.customer_id)
         customer1.customer_id,
         first_name,
         last_name,
         email,
         purchase.purchase_id,
         purchase.purchase_time,
         purchase_item.quantity,
         purchase_item.total_amount_paid
FROM customer1
  LEFT JOIN purchase ON customer1.customer_id = purchase.customer_id
  LEFT JOIN purchase_item ON purchase.purchase_id = purchase_item.purchase_id
ORDER BY customer1.customer_id, purchase_time desc;

 customer_id | first_name | last_name |           email           | purchase_id |         purchase_time         | quantity | total_amount_paid
-------------+------------+-----------+---------------------------+-------------+-------------------------------+----------+-------------------
           1 | James      | Smith     | jamessmith@example.com    |         102 | 2019-06-14 20:17:26.759086+00 |        1 |           1995.00
           2 | Mary       | Johnson   | maryjohnson@example.com   |         103 | 2019-06-14 20:17:26.759098+00 |        2 |            200.00
           3 | John       | Williams  | johnwilliams@example.com  |         104 | 2019-06-14 20:17:26.759109+00 |        1 |             60.00
           4 | Patricia   | Brown     | patriciabrown@example.com |             |                               |          |
           5 | Michael    | Garcia    | michaelgarcia@example.com |         105 | 2019-06-14 20:17:26.75912+00  |        1 |            400.00
(5 rows)

Вы можете изменить ЛЕВЫЕ СОЕДИНЕНИЯ на СОЕДИНЕНИЯ, если вы не хотите видеть клиентов без покупок.

...